Home | History | Annotate | Download | only in Python
      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 "node.h"
      9 #include "ast.h"
     10 #include "token.h"
     11 #include "pythonrun.h"
     12 
     13 #include <assert.h>
     14 #include <stdbool.h>
     15 
     16 static int validate_stmts(asdl_seq *);
     17 static int validate_exprs(asdl_seq *, expr_context_ty, int);
     18 static int validate_nonempty_seq(asdl_seq *, const char *, const char *);
     19 static int validate_stmt(stmt_ty);
     20 static int validate_expr(expr_ty, expr_context_ty);
     21 
     22 static int
     23 validate_comprehension(asdl_seq *gens)
     24 {
     25     int i;
     26     if (!asdl_seq_LEN(gens)) {
     27         PyErr_SetString(PyExc_ValueError, "comprehension with no generators");
     28         return 0;
     29     }
     30     for (i = 0; i < asdl_seq_LEN(gens); i++) {
     31         comprehension_ty comp = asdl_seq_GET(gens, i);
     32         if (!validate_expr(comp->target, Store) ||
     33             !validate_expr(comp->iter, Load) ||
     34             !validate_exprs(comp->ifs, Load, 0))
     35             return 0;
     36     }
     37     return 1;
     38 }
     39 
     40 static int
     41 validate_slice(slice_ty slice)
     42 {
     43     switch (slice->kind) {
     44     case Slice_kind:
     45         return (!slice->v.Slice.lower || validate_expr(slice->v.Slice.lower, Load)) &&
     46             (!slice->v.Slice.upper || validate_expr(slice->v.Slice.upper, Load)) &&
     47             (!slice->v.Slice.step || validate_expr(slice->v.Slice.step, Load));
     48     case ExtSlice_kind: {
     49         int i;
     50         if (!validate_nonempty_seq(slice->v.ExtSlice.dims, "dims", "ExtSlice"))
     51             return 0;
     52         for (i = 0; i < asdl_seq_LEN(slice->v.ExtSlice.dims); i++)
     53             if (!validate_slice(asdl_seq_GET(slice->v.ExtSlice.dims, i)))
     54                 return 0;
     55         return 1;
     56     }
     57     case Index_kind:
     58         return validate_expr(slice->v.Index.value, Load);
     59     default:
     60         PyErr_SetString(PyExc_SystemError, "unknown slice node");
     61         return 0;
     62     }
     63 }
     64 
     65 static int
     66 validate_keywords(asdl_seq *keywords)
     67 {
     68     int i;
     69     for (i = 0; i < asdl_seq_LEN(keywords); i++)
     70         if (!validate_expr(((keyword_ty)asdl_seq_GET(keywords, i))->value, Load))
     71             return 0;
     72     return 1;
     73 }
     74 
     75 static int
     76 validate_args(asdl_seq *args)
     77 {
     78     int i;
     79     for (i = 0; i < asdl_seq_LEN(args); i++) {
     80         arg_ty arg = asdl_seq_GET(args, i);
     81         if (arg->annotation && !validate_expr(arg->annotation, Load))
     82             return 0;
     83     }
     84     return 1;
     85 }
     86 
     87 static const char *
     88 expr_context_name(expr_context_ty ctx)
     89 {
     90     switch (ctx) {
     91     case Load:
     92         return "Load";
     93     case Store:
     94         return "Store";
     95     case Del:
     96         return "Del";
     97     case AugLoad:
     98         return "AugLoad";
     99     case AugStore:
    100         return "AugStore";
    101     case Param:
    102         return "Param";
    103     default:
    104         Py_UNREACHABLE();
    105     }
    106 }
    107 
    108 static int
    109 validate_arguments(arguments_ty args)
    110 {
    111     if (!validate_args(args->args))
    112         return 0;
    113     if (args->vararg && args->vararg->annotation
    114         && !validate_expr(args->vararg->annotation, Load)) {
    115             return 0;
    116     }
    117     if (!validate_args(args->kwonlyargs))
    118         return 0;
    119     if (args->kwarg && args->kwarg->annotation
    120         && !validate_expr(args->kwarg->annotation, Load)) {
    121             return 0;
    122     }
    123     if (asdl_seq_LEN(args->defaults) > asdl_seq_LEN(args->args)) {
    124         PyErr_SetString(PyExc_ValueError, "more positional defaults than args on arguments");
    125         return 0;
    126     }
    127     if (asdl_seq_LEN(args->kw_defaults) != asdl_seq_LEN(args->kwonlyargs)) {
    128         PyErr_SetString(PyExc_ValueError, "length of kwonlyargs is not the same as "
    129                         "kw_defaults on arguments");
    130         return 0;
    131     }
    132     return validate_exprs(args->defaults, Load, 0) && validate_exprs(args->kw_defaults, Load, 1);
    133 }
    134 
    135 static int
    136 validate_constant(PyObject *value)
    137 {
    138     if (value == Py_None || value == Py_Ellipsis)
    139         return 1;
    140 
    141     if (PyLong_CheckExact(value)
    142             || PyFloat_CheckExact(value)
    143             || PyComplex_CheckExact(value)
    144             || PyBool_Check(value)
    145             || PyUnicode_CheckExact(value)
    146             || PyBytes_CheckExact(value))
    147         return 1;
    148 
    149     if (PyTuple_CheckExact(value) || PyFrozenSet_CheckExact(value)) {
    150         PyObject *it;
    151 
    152         it = PyObject_GetIter(value);
    153         if (it == NULL)
    154             return 0;
    155 
    156         while (1) {
    157             PyObject *item = PyIter_Next(it);
    158             if (item == NULL) {
    159                 if (PyErr_Occurred()) {
    160                     Py_DECREF(it);
    161                     return 0;
    162                 }
    163                 break;
    164             }
    165 
    166             if (!validate_constant(item)) {
    167                 Py_DECREF(it);
    168                 Py_DECREF(item);
    169                 return 0;
    170             }
    171             Py_DECREF(item);
    172         }
    173 
    174         Py_DECREF(it);
    175         return 1;
    176     }
    177 
    178     return 0;
    179 }
    180 
    181 static int
    182 validate_expr(expr_ty exp, expr_context_ty ctx)
    183 {
    184     int check_ctx = 1;
    185     expr_context_ty actual_ctx;
    186 
    187     /* First check expression context. */
    188     switch (exp->kind) {
    189     case Attribute_kind:
    190         actual_ctx = exp->v.Attribute.ctx;
    191         break;
    192     case Subscript_kind:
    193         actual_ctx = exp->v.Subscript.ctx;
    194         break;
    195     case Starred_kind:
    196         actual_ctx = exp->v.Starred.ctx;
    197         break;
    198     case Name_kind:
    199         actual_ctx = exp->v.Name.ctx;
    200         break;
    201     case List_kind:
    202         actual_ctx = exp->v.List.ctx;
    203         break;
    204     case Tuple_kind:
    205         actual_ctx = exp->v.Tuple.ctx;
    206         break;
    207     default:
    208         if (ctx != Load) {
    209             PyErr_Format(PyExc_ValueError, "expression which can't be "
    210                          "assigned to in %s context", expr_context_name(ctx));
    211             return 0;
    212         }
    213         check_ctx = 0;
    214         /* set actual_ctx to prevent gcc warning */
    215         actual_ctx = 0;
    216     }
    217     if (check_ctx && actual_ctx != ctx) {
    218         PyErr_Format(PyExc_ValueError, "expression must have %s context but has %s instead",
    219                      expr_context_name(ctx), expr_context_name(actual_ctx));
    220         return 0;
    221     }
    222 
    223     /* Now validate expression. */
    224     switch (exp->kind) {
    225     case BoolOp_kind:
    226         if (asdl_seq_LEN(exp->v.BoolOp.values) < 2) {
    227             PyErr_SetString(PyExc_ValueError, "BoolOp with less than 2 values");
    228             return 0;
    229         }
    230         return validate_exprs(exp->v.BoolOp.values, Load, 0);
    231     case BinOp_kind:
    232         return validate_expr(exp->v.BinOp.left, Load) &&
    233             validate_expr(exp->v.BinOp.right, Load);
    234     case UnaryOp_kind:
    235         return validate_expr(exp->v.UnaryOp.operand, Load);
    236     case Lambda_kind:
    237         return validate_arguments(exp->v.Lambda.args) &&
    238             validate_expr(exp->v.Lambda.body, Load);
    239     case IfExp_kind:
    240         return validate_expr(exp->v.IfExp.test, Load) &&
    241             validate_expr(exp->v.IfExp.body, Load) &&
    242             validate_expr(exp->v.IfExp.orelse, Load);
    243     case Dict_kind:
    244         if (asdl_seq_LEN(exp->v.Dict.keys) != asdl_seq_LEN(exp->v.Dict.values)) {
    245             PyErr_SetString(PyExc_ValueError,
    246                             "Dict doesn't have the same number of keys as values");
    247             return 0;
    248         }
    249         /* null_ok=1 for keys expressions to allow dict unpacking to work in
    250            dict literals, i.e. ``{**{a:b}}`` */
    251         return validate_exprs(exp->v.Dict.keys, Load, /*null_ok=*/ 1) &&
    252             validate_exprs(exp->v.Dict.values, Load, /*null_ok=*/ 0);
    253     case Set_kind:
    254         return validate_exprs(exp->v.Set.elts, Load, 0);
    255 #define COMP(NAME) \
    256         case NAME ## _kind: \
    257             return validate_comprehension(exp->v.NAME.generators) && \
    258                 validate_expr(exp->v.NAME.elt, Load);
    259     COMP(ListComp)
    260     COMP(SetComp)
    261     COMP(GeneratorExp)
    262 #undef COMP
    263     case DictComp_kind:
    264         return validate_comprehension(exp->v.DictComp.generators) &&
    265             validate_expr(exp->v.DictComp.key, Load) &&
    266             validate_expr(exp->v.DictComp.value, Load);
    267     case Yield_kind:
    268         return !exp->v.Yield.value || validate_expr(exp->v.Yield.value, Load);
    269     case YieldFrom_kind:
    270         return validate_expr(exp->v.YieldFrom.value, Load);
    271     case Await_kind:
    272         return validate_expr(exp->v.Await.value, Load);
    273     case Compare_kind:
    274         if (!asdl_seq_LEN(exp->v.Compare.comparators)) {
    275             PyErr_SetString(PyExc_ValueError, "Compare with no comparators");
    276             return 0;
    277         }
    278         if (asdl_seq_LEN(exp->v.Compare.comparators) !=
    279             asdl_seq_LEN(exp->v.Compare.ops)) {
    280             PyErr_SetString(PyExc_ValueError, "Compare has a different number "
    281                             "of comparators and operands");
    282             return 0;
    283         }
    284         return validate_exprs(exp->v.Compare.comparators, Load, 0) &&
    285             validate_expr(exp->v.Compare.left, Load);
    286     case Call_kind:
    287         return validate_expr(exp->v.Call.func, Load) &&
    288             validate_exprs(exp->v.Call.args, Load, 0) &&
    289             validate_keywords(exp->v.Call.keywords);
    290     case Constant_kind:
    291         if (!validate_constant(exp->v.Constant.value)) {
    292             PyErr_Format(PyExc_TypeError,
    293                          "got an invalid type in Constant: %s",
    294                          Py_TYPE(exp->v.Constant.value)->tp_name);
    295             return 0;
    296         }
    297         return 1;
    298     case Num_kind: {
    299         PyObject *n = exp->v.Num.n;
    300         if (!PyLong_CheckExact(n) && !PyFloat_CheckExact(n) &&
    301             !PyComplex_CheckExact(n)) {
    302             PyErr_SetString(PyExc_TypeError, "non-numeric type in Num");
    303             return 0;
    304         }
    305         return 1;
    306     }
    307     case Str_kind: {
    308         PyObject *s = exp->v.Str.s;
    309         if (!PyUnicode_CheckExact(s)) {
    310             PyErr_SetString(PyExc_TypeError, "non-string type in Str");
    311             return 0;
    312         }
    313         return 1;
    314     }
    315     case JoinedStr_kind:
    316         return validate_exprs(exp->v.JoinedStr.values, Load, 0);
    317     case FormattedValue_kind:
    318         if (validate_expr(exp->v.FormattedValue.value, Load) == 0)
    319             return 0;
    320         if (exp->v.FormattedValue.format_spec)
    321             return validate_expr(exp->v.FormattedValue.format_spec, Load);
    322         return 1;
    323     case Bytes_kind: {
    324         PyObject *b = exp->v.Bytes.s;
    325         if (!PyBytes_CheckExact(b)) {
    326             PyErr_SetString(PyExc_TypeError, "non-bytes type in Bytes");
    327             return 0;
    328         }
    329         return 1;
    330     }
    331     case Attribute_kind:
    332         return validate_expr(exp->v.Attribute.value, Load);
    333     case Subscript_kind:
    334         return validate_slice(exp->v.Subscript.slice) &&
    335             validate_expr(exp->v.Subscript.value, Load);
    336     case Starred_kind:
    337         return validate_expr(exp->v.Starred.value, ctx);
    338     case List_kind:
    339         return validate_exprs(exp->v.List.elts, ctx, 0);
    340     case Tuple_kind:
    341         return validate_exprs(exp->v.Tuple.elts, ctx, 0);
    342     /* These last cases don't have any checking. */
    343     case Name_kind:
    344     case NameConstant_kind:
    345     case Ellipsis_kind:
    346         return 1;
    347     default:
    348         PyErr_SetString(PyExc_SystemError, "unexpected expression");
    349         return 0;
    350     }
    351 }
    352 
    353 static int
    354 validate_nonempty_seq(asdl_seq *seq, const char *what, const char *owner)
    355 {
    356     if (asdl_seq_LEN(seq))
    357         return 1;
    358     PyErr_Format(PyExc_ValueError, "empty %s on %s", what, owner);
    359     return 0;
    360 }
    361 
    362 static int
    363 validate_assignlist(asdl_seq *targets, expr_context_ty ctx)
    364 {
    365     return validate_nonempty_seq(targets, "targets", ctx == Del ? "Delete" : "Assign") &&
    366         validate_exprs(targets, ctx, 0);
    367 }
    368 
    369 static int
    370 validate_body(asdl_seq *body, const char *owner)
    371 {
    372     return validate_nonempty_seq(body, "body", owner) && validate_stmts(body);
    373 }
    374 
    375 static int
    376 validate_stmt(stmt_ty stmt)
    377 {
    378     int i;
    379     switch (stmt->kind) {
    380     case FunctionDef_kind:
    381         return validate_body(stmt->v.FunctionDef.body, "FunctionDef") &&
    382             validate_arguments(stmt->v.FunctionDef.args) &&
    383             validate_exprs(stmt->v.FunctionDef.decorator_list, Load, 0) &&
    384             (!stmt->v.FunctionDef.returns ||
    385              validate_expr(stmt->v.FunctionDef.returns, Load));
    386     case ClassDef_kind:
    387         return validate_body(stmt->v.ClassDef.body, "ClassDef") &&
    388             validate_exprs(stmt->v.ClassDef.bases, Load, 0) &&
    389             validate_keywords(stmt->v.ClassDef.keywords) &&
    390             validate_exprs(stmt->v.ClassDef.decorator_list, Load, 0);
    391     case Return_kind:
    392         return !stmt->v.Return.value || validate_expr(stmt->v.Return.value, Load);
    393     case Delete_kind:
    394         return validate_assignlist(stmt->v.Delete.targets, Del);
    395     case Assign_kind:
    396         return validate_assignlist(stmt->v.Assign.targets, Store) &&
    397             validate_expr(stmt->v.Assign.value, Load);
    398     case AugAssign_kind:
    399         return validate_expr(stmt->v.AugAssign.target, Store) &&
    400             validate_expr(stmt->v.AugAssign.value, Load);
    401     case AnnAssign_kind:
    402         if (stmt->v.AnnAssign.target->kind != Name_kind &&
    403             stmt->v.AnnAssign.simple) {
    404             PyErr_SetString(PyExc_TypeError,
    405                             "AnnAssign with simple non-Name target");
    406             return 0;
    407         }
    408         return validate_expr(stmt->v.AnnAssign.target, Store) &&
    409                (!stmt->v.AnnAssign.value ||
    410                 validate_expr(stmt->v.AnnAssign.value, Load)) &&
    411                validate_expr(stmt->v.AnnAssign.annotation, Load);
    412     case For_kind:
    413         return validate_expr(stmt->v.For.target, Store) &&
    414             validate_expr(stmt->v.For.iter, Load) &&
    415             validate_body(stmt->v.For.body, "For") &&
    416             validate_stmts(stmt->v.For.orelse);
    417     case AsyncFor_kind:
    418         return validate_expr(stmt->v.AsyncFor.target, Store) &&
    419             validate_expr(stmt->v.AsyncFor.iter, Load) &&
    420             validate_body(stmt->v.AsyncFor.body, "AsyncFor") &&
    421             validate_stmts(stmt->v.AsyncFor.orelse);
    422     case While_kind:
    423         return validate_expr(stmt->v.While.test, Load) &&
    424             validate_body(stmt->v.While.body, "While") &&
    425             validate_stmts(stmt->v.While.orelse);
    426     case If_kind:
    427         return validate_expr(stmt->v.If.test, Load) &&
    428             validate_body(stmt->v.If.body, "If") &&
    429             validate_stmts(stmt->v.If.orelse);
    430     case With_kind:
    431         if (!validate_nonempty_seq(stmt->v.With.items, "items", "With"))
    432             return 0;
    433         for (i = 0; i < asdl_seq_LEN(stmt->v.With.items); i++) {
    434             withitem_ty item = asdl_seq_GET(stmt->v.With.items, i);
    435             if (!validate_expr(item->context_expr, Load) ||
    436                 (item->optional_vars && !validate_expr(item->optional_vars, Store)))
    437                 return 0;
    438         }
    439         return validate_body(stmt->v.With.body, "With");
    440     case AsyncWith_kind:
    441         if (!validate_nonempty_seq(stmt->v.AsyncWith.items, "items", "AsyncWith"))
    442             return 0;
    443         for (i = 0; i < asdl_seq_LEN(stmt->v.AsyncWith.items); i++) {
    444             withitem_ty item = asdl_seq_GET(stmt->v.AsyncWith.items, i);
    445             if (!validate_expr(item->context_expr, Load) ||
    446                 (item->optional_vars && !validate_expr(item->optional_vars, Store)))
    447                 return 0;
    448         }
    449         return validate_body(stmt->v.AsyncWith.body, "AsyncWith");
    450     case Raise_kind:
    451         if (stmt->v.Raise.exc) {
    452             return validate_expr(stmt->v.Raise.exc, Load) &&
    453                 (!stmt->v.Raise.cause || validate_expr(stmt->v.Raise.cause, Load));
    454         }
    455         if (stmt->v.Raise.cause) {
    456             PyErr_SetString(PyExc_ValueError, "Raise with cause but no exception");
    457             return 0;
    458         }
    459         return 1;
    460     case Try_kind:
    461         if (!validate_body(stmt->v.Try.body, "Try"))
    462             return 0;
    463         if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
    464             !asdl_seq_LEN(stmt->v.Try.finalbody)) {
    465             PyErr_SetString(PyExc_ValueError, "Try has neither except handlers nor finalbody");
    466             return 0;
    467         }
    468         if (!asdl_seq_LEN(stmt->v.Try.handlers) &&
    469             asdl_seq_LEN(stmt->v.Try.orelse)) {
    470             PyErr_SetString(PyExc_ValueError, "Try has orelse but no except handlers");
    471             return 0;
    472         }
    473         for (i = 0; i < asdl_seq_LEN(stmt->v.Try.handlers); i++) {
    474             excepthandler_ty handler = asdl_seq_GET(stmt->v.Try.handlers, i);
    475             if ((handler->v.ExceptHandler.type &&
    476                  !validate_expr(handler->v.ExceptHandler.type, Load)) ||
    477                 !validate_body(handler->v.ExceptHandler.body, "ExceptHandler"))
    478                 return 0;
    479         }
    480         return (!asdl_seq_LEN(stmt->v.Try.finalbody) ||
    481                 validate_stmts(stmt->v.Try.finalbody)) &&
    482             (!asdl_seq_LEN(stmt->v.Try.orelse) ||
    483              validate_stmts(stmt->v.Try.orelse));
    484     case Assert_kind:
    485         return validate_expr(stmt->v.Assert.test, Load) &&
    486             (!stmt->v.Assert.msg || validate_expr(stmt->v.Assert.msg, Load));
    487     case Import_kind:
    488         return validate_nonempty_seq(stmt->v.Import.names, "names", "Import");
    489     case ImportFrom_kind:
    490         if (stmt->v.ImportFrom.level < 0) {
    491             PyErr_SetString(PyExc_ValueError, "Negative ImportFrom level");
    492             return 0;
    493         }
    494         return validate_nonempty_seq(stmt->v.ImportFrom.names, "names", "ImportFrom");
    495     case Global_kind:
    496         return validate_nonempty_seq(stmt->v.Global.names, "names", "Global");
    497     case Nonlocal_kind:
    498         return validate_nonempty_seq(stmt->v.Nonlocal.names, "names", "Nonlocal");
    499     case Expr_kind:
    500         return validate_expr(stmt->v.Expr.value, Load);
    501     case AsyncFunctionDef_kind:
    502         return validate_body(stmt->v.AsyncFunctionDef.body, "AsyncFunctionDef") &&
    503             validate_arguments(stmt->v.AsyncFunctionDef.args) &&
    504             validate_exprs(stmt->v.AsyncFunctionDef.decorator_list, Load, 0) &&
    505             (!stmt->v.AsyncFunctionDef.returns ||
    506              validate_expr(stmt->v.AsyncFunctionDef.returns, Load));
    507     case Pass_kind:
    508     case Break_kind:
    509     case Continue_kind:
    510         return 1;
    511     default:
    512         PyErr_SetString(PyExc_SystemError, "unexpected statement");
    513         return 0;
    514     }
    515 }
    516 
    517 static int
    518 validate_stmts(asdl_seq *seq)
    519 {
    520     int i;
    521     for (i = 0; i < asdl_seq_LEN(seq); i++) {
    522         stmt_ty stmt = asdl_seq_GET(seq, i);
    523         if (stmt) {
    524             if (!validate_stmt(stmt))
    525                 return 0;
    526         }
    527         else {
    528             PyErr_SetString(PyExc_ValueError,
    529                             "None disallowed in statement list");
    530             return 0;
    531         }
    532     }
    533     return 1;
    534 }
    535 
    536 static int
    537 validate_exprs(asdl_seq *exprs, expr_context_ty ctx, int null_ok)
    538 {
    539     int i;
    540     for (i = 0; i < asdl_seq_LEN(exprs); i++) {
    541         expr_ty expr = asdl_seq_GET(exprs, i);
    542         if (expr) {
    543             if (!validate_expr(expr, ctx))
    544                 return 0;
    545         }
    546         else if (!null_ok) {
    547             PyErr_SetString(PyExc_ValueError,
    548                             "None disallowed in expression list");
    549             return 0;
    550         }
    551 
    552     }
    553     return 1;
    554 }
    555 
    556 int
    557 PyAST_Validate(mod_ty mod)
    558 {
    559     int res = 0;
    560 
    561     switch (mod->kind) {
    562     case Module_kind:
    563         res = validate_stmts(mod->v.Module.body);
    564         break;
    565     case Interactive_kind:
    566         res = validate_stmts(mod->v.Interactive.body);
    567         break;
    568     case Expression_kind:
    569         res = validate_expr(mod->v.Expression.body, Load);
    570         break;
    571     case Suite_kind:
    572         PyErr_SetString(PyExc_ValueError, "Suite is not valid in the CPython compiler");
    573         break;
    574     default:
    575         PyErr_SetString(PyExc_SystemError, "impossible module node");
    576         res = 0;
    577         break;
    578     }
    579     return res;
    580 }
    581 
    582 /* This is done here, so defines like "test" don't interfere with AST use above. */
    583 #include "grammar.h"
    584 #include "parsetok.h"
    585 #include "graminit.h"
    586 
    587 /* Data structure used internally */
    588 struct compiling {
    589     PyArena *c_arena; /* Arena for allocating memory. */
    590     PyObject *c_filename; /* filename */
    591     PyObject *c_normalize; /* Normalization function from unicodedata. */
    592 };
    593 
    594 static asdl_seq *seq_for_testlist(struct compiling *, const node *);
    595 static expr_ty ast_for_expr(struct compiling *, const node *);
    596 static stmt_ty ast_for_stmt(struct compiling *, const node *);
    597 static asdl_seq *ast_for_suite(struct compiling *c, const node *n);
    598 static asdl_seq *ast_for_exprlist(struct compiling *, const node *,
    599                                   expr_context_ty);
    600 static expr_ty ast_for_testlist(struct compiling *, const node *);
    601 static stmt_ty ast_for_classdef(struct compiling *, const node *, asdl_seq *);
    602 
    603 static stmt_ty ast_for_with_stmt(struct compiling *, const node *, bool);
    604 static stmt_ty ast_for_for_stmt(struct compiling *, const node *, bool);
    605 
    606 /* Note different signature for ast_for_call */
    607 static expr_ty ast_for_call(struct compiling *, const node *, expr_ty, bool);
    608 
    609 static PyObject *parsenumber(struct compiling *, const char *);
    610 static expr_ty parsestrplus(struct compiling *, const node *n);
    611 
    612 #define COMP_GENEXP   0
    613 #define COMP_LISTCOMP 1
    614 #define COMP_SETCOMP  2
    615 
    616 static int
    617 init_normalization(struct compiling *c)
    618 {
    619     PyObject *m = PyImport_ImportModuleNoBlock("unicodedata");
    620     if (!m)
    621         return 0;
    622     c->c_normalize = PyObject_GetAttrString(m, "normalize");
    623     Py_DECREF(m);
    624     if (!c->c_normalize)
    625         return 0;
    626     return 1;
    627 }
    628 
    629 static identifier
    630 new_identifier(const char *n, struct compiling *c)
    631 {
    632     PyObject *id = PyUnicode_DecodeUTF8(n, strlen(n), NULL);
    633     if (!id)
    634         return NULL;
    635     /* PyUnicode_DecodeUTF8 should always return a ready string. */
    636     assert(PyUnicode_IS_READY(id));
    637     /* Check whether there are non-ASCII characters in the
    638        identifier; if so, normalize to NFKC. */
    639     if (!PyUnicode_IS_ASCII(id)) {
    640         PyObject *id2;
    641         _Py_IDENTIFIER(NFKC);
    642         if (!c->c_normalize && !init_normalization(c)) {
    643             Py_DECREF(id);
    644             return NULL;
    645         }
    646         PyObject *form = _PyUnicode_FromId(&PyId_NFKC);
    647         if (form == NULL) {
    648             Py_DECREF(id);
    649             return NULL;
    650         }
    651         PyObject *args[2] = {form, id};
    652         id2 = _PyObject_FastCall(c->c_normalize, args, 2);
    653         Py_DECREF(id);
    654         if (!id2)
    655             return NULL;
    656         if (!PyUnicode_Check(id2)) {
    657             PyErr_Format(PyExc_TypeError,
    658                          "unicodedata.normalize() must return a string, not "
    659                          "%.200s",
    660                          Py_TYPE(id2)->tp_name);
    661             Py_DECREF(id2);
    662             return NULL;
    663         }
    664         id = id2;
    665     }
    666     PyUnicode_InternInPlace(&id);
    667     if (PyArena_AddPyObject(c->c_arena, id) < 0) {
    668         Py_DECREF(id);
    669         return NULL;
    670     }
    671     return id;
    672 }
    673 
    674 #define NEW_IDENTIFIER(n) new_identifier(STR(n), c)
    675 
    676 static int
    677 ast_error(struct compiling *c, const node *n, const char *errmsg)
    678 {
    679     PyObject *value, *errstr, *loc, *tmp;
    680 
    681     loc = PyErr_ProgramTextObject(c->c_filename, LINENO(n));
    682     if (!loc) {
    683         Py_INCREF(Py_None);
    684         loc = Py_None;
    685     }
    686     tmp = Py_BuildValue("(OiiN)", c->c_filename, LINENO(n), n->n_col_offset, loc);
    687     if (!tmp)
    688         return 0;
    689     errstr = PyUnicode_FromString(errmsg);
    690     if (!errstr) {
    691         Py_DECREF(tmp);
    692         return 0;
    693     }
    694     value = PyTuple_Pack(2, errstr, tmp);
    695     Py_DECREF(errstr);
    696     Py_DECREF(tmp);
    697     if (value) {
    698         PyErr_SetObject(PyExc_SyntaxError, value);
    699         Py_DECREF(value);
    700     }
    701     return 0;
    702 }
    703 
    704 /* num_stmts() returns number of contained statements.
    705 
    706    Use this routine to determine how big a sequence is needed for
    707    the statements in a parse tree.  Its raison d'etre is this bit of
    708    grammar:
    709 
    710    stmt: simple_stmt | compound_stmt
    711    simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE
    712 
    713    A simple_stmt can contain multiple small_stmt elements joined
    714    by semicolons.  If the arg is a simple_stmt, the number of
    715    small_stmt elements is returned.
    716 */
    717 
    718 static int
    719 num_stmts(const node *n)
    720 {
    721     int i, l;
    722     node *ch;
    723 
    724     switch (TYPE(n)) {
    725         case single_input:
    726             if (TYPE(CHILD(n, 0)) == NEWLINE)
    727                 return 0;
    728             else
    729                 return num_stmts(CHILD(n, 0));
    730         case file_input:
    731             l = 0;
    732             for (i = 0; i < NCH(n); i++) {
    733                 ch = CHILD(n, i);
    734                 if (TYPE(ch) == stmt)
    735                     l += num_stmts(ch);
    736             }
    737             return l;
    738         case stmt:
    739             return num_stmts(CHILD(n, 0));
    740         case compound_stmt:
    741             return 1;
    742         case simple_stmt:
    743             return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */
    744         case suite:
    745             if (NCH(n) == 1)
    746                 return num_stmts(CHILD(n, 0));
    747             else {
    748                 l = 0;
    749                 for (i = 2; i < (NCH(n) - 1); i++)
    750                     l += num_stmts(CHILD(n, i));
    751                 return l;
    752             }
    753         default: {
    754             char buf[128];
    755 
    756             sprintf(buf, "Non-statement found: %d %d",
    757                     TYPE(n), NCH(n));
    758             Py_FatalError(buf);
    759         }
    760     }
    761     Py_UNREACHABLE();
    762 }
    763 
    764 /* Transform the CST rooted at node * to the appropriate AST
    765 */
    766 
    767 mod_ty
    768 PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags,
    769                      PyObject *filename, PyArena *arena)
    770 {
    771     int i, j, k, num;
    772     asdl_seq *stmts = NULL;
    773     stmt_ty s;
    774     node *ch;
    775     struct compiling c;
    776     mod_ty res = NULL;
    777 
    778     c.c_arena = arena;
    779     /* borrowed reference */
    780     c.c_filename = filename;
    781     c.c_normalize = NULL;
    782 
    783     if (TYPE(n) == encoding_decl)
    784         n = CHILD(n, 0);
    785 
    786     k = 0;
    787     switch (TYPE(n)) {
    788         case file_input:
    789             stmts = _Py_asdl_seq_new(num_stmts(n), arena);
    790             if (!stmts)
    791                 goto out;
    792             for (i = 0; i < NCH(n) - 1; i++) {
    793                 ch = CHILD(n, i);
    794                 if (TYPE(ch) == NEWLINE)
    795                     continue;
    796                 REQ(ch, stmt);
    797                 num = num_stmts(ch);
    798                 if (num == 1) {
    799                     s = ast_for_stmt(&c, ch);
    800                     if (!s)
    801                         goto out;
    802                     asdl_seq_SET(stmts, k++, s);
    803                 }
    804                 else {
    805                     ch = CHILD(ch, 0);
    806                     REQ(ch, simple_stmt);
    807                     for (j = 0; j < num; j++) {
    808                         s = ast_for_stmt(&c, CHILD(ch, j * 2));
    809                         if (!s)
    810                             goto out;
    811                         asdl_seq_SET(stmts, k++, s);
    812                     }
    813                 }
    814             }
    815             res = Module(stmts, arena);
    816             break;
    817         case eval_input: {
    818             expr_ty testlist_ast;
    819 
    820             /* XXX Why not comp_for here? */
    821             testlist_ast = ast_for_testlist(&c, CHILD(n, 0));
    822             if (!testlist_ast)
    823                 goto out;
    824             res = Expression(testlist_ast, arena);
    825             break;
    826         }
    827         case single_input:
    828             if (TYPE(CHILD(n, 0)) == NEWLINE) {
    829                 stmts = _Py_asdl_seq_new(1, arena);
    830                 if (!stmts)
    831                     goto out;
    832                 asdl_seq_SET(stmts, 0, Pass(n->n_lineno, n->n_col_offset,
    833                                             arena));
    834                 if (!asdl_seq_GET(stmts, 0))
    835                     goto out;
    836                 res = Interactive(stmts, arena);
    837             }
    838             else {
    839                 n = CHILD(n, 0);
    840                 num = num_stmts(n);
    841                 stmts = _Py_asdl_seq_new(num, arena);
    842                 if (!stmts)
    843                     goto out;
    844                 if (num == 1) {
    845                     s = ast_for_stmt(&c, n);
    846                     if (!s)
    847                         goto out;
    848                     asdl_seq_SET(stmts, 0, s);
    849                 }
    850                 else {
    851                     /* Only a simple_stmt can contain multiple statements. */
    852                     REQ(n, simple_stmt);
    853                     for (i = 0; i < NCH(n); i += 2) {
    854                         if (TYPE(CHILD(n, i)) == NEWLINE)
    855                             break;
    856                         s = ast_for_stmt(&c, CHILD(n, i));
    857                         if (!s)
    858                             goto out;
    859                         asdl_seq_SET(stmts, i / 2, s);
    860                     }
    861                 }
    862 
    863                 res = Interactive(stmts, arena);
    864             }
    865             break;
    866         default:
    867             PyErr_Format(PyExc_SystemError,
    868                          "invalid node %d for PyAST_FromNode", TYPE(n));
    869             goto out;
    870     }
    871  out:
    872     if (c.c_normalize) {
    873         Py_DECREF(c.c_normalize);
    874     }
    875     return res;
    876 }
    877 
    878 mod_ty
    879 PyAST_FromNode(const node *n, PyCompilerFlags *flags, const char *filename_str,
    880                PyArena *arena)
    881 {
    882     mod_ty mod;
    883     PyObject *filename;
    884     filename = PyUnicode_DecodeFSDefault(filename_str);
    885     if (filename == NULL)
    886         return NULL;
    887     mod = PyAST_FromNodeObject(n, flags, filename, arena);
    888     Py_DECREF(filename);
    889     return mod;
    890 
    891 }
    892 
    893 /* Return the AST repr. of the operator represented as syntax (|, ^, etc.)
    894 */
    895 
    896 static operator_ty
    897 get_operator(const node *n)
    898 {
    899     switch (TYPE(n)) {
    900         case VBAR:
    901             return BitOr;
    902         case CIRCUMFLEX:
    903             return BitXor;
    904         case AMPER:
    905             return BitAnd;
    906         case LEFTSHIFT:
    907             return LShift;
    908         case RIGHTSHIFT:
    909             return RShift;
    910         case PLUS:
    911             return Add;
    912         case MINUS:
    913             return Sub;
    914         case STAR:
    915             return Mult;
    916         case AT:
    917             return MatMult;
    918         case SLASH:
    919             return Div;
    920         case DOUBLESLASH:
    921             return FloorDiv;
    922         case PERCENT:
    923             return Mod;
    924         default:
    925             return (operator_ty)0;
    926     }
    927 }
    928 
    929 static const char * const FORBIDDEN[] = {
    930     "None",
    931     "True",
    932     "False",
    933     NULL,
    934 };
    935 
    936 static int
    937 forbidden_name(struct compiling *c, identifier name, const node *n,
    938                int full_checks)
    939 {
    940     assert(PyUnicode_Check(name));
    941     if (_PyUnicode_EqualToASCIIString(name, "__debug__")) {
    942         ast_error(c, n, "assignment to keyword");
    943         return 1;
    944     }
    945     if (full_checks) {
    946         const char * const *p;
    947         for (p = FORBIDDEN; *p; p++) {
    948             if (_PyUnicode_EqualToASCIIString(name, *p)) {
    949                 ast_error(c, n, "assignment to keyword");
    950                 return 1;
    951             }
    952         }
    953     }
    954     return 0;
    955 }
    956 
    957 /* Set the context ctx for expr_ty e, recursively traversing e.
    958 
    959    Only sets context for expr kinds that "can appear in assignment context"
    960    (according to ../Parser/Python.asdl).  For other expr kinds, it sets
    961    an appropriate syntax error and returns false.
    962 */
    963 
    964 static int
    965 set_context(struct compiling *c, expr_ty e, expr_context_ty ctx, const node *n)
    966 {
    967     asdl_seq *s = NULL;
    968     /* If a particular expression type can't be used for assign / delete,
    969        set expr_name to its name and an error message will be generated.
    970     */
    971     const char* expr_name = NULL;
    972 
    973     /* The ast defines augmented store and load contexts, but the
    974        implementation here doesn't actually use them.  The code may be
    975        a little more complex than necessary as a result.  It also means
    976        that expressions in an augmented assignment have a Store context.
    977        Consider restructuring so that augmented assignment uses
    978        set_context(), too.
    979     */
    980     assert(ctx != AugStore && ctx != AugLoad);
    981 
    982     switch (e->kind) {
    983         case Attribute_kind:
    984             e->v.Attribute.ctx = ctx;
    985             if (ctx == Store && forbidden_name(c, e->v.Attribute.attr, n, 1))
    986                 return 0;
    987             break;
    988         case Subscript_kind:
    989             e->v.Subscript.ctx = ctx;
    990             break;
    991         case Starred_kind:
    992             e->v.Starred.ctx = ctx;
    993             if (!set_context(c, e->v.Starred.value, ctx, n))
    994                 return 0;
    995             break;
    996         case Name_kind:
    997             if (ctx == Store) {
    998                 if (forbidden_name(c, e->v.Name.id, n, 0))
    999                     return 0; /* forbidden_name() calls ast_error() */
   1000             }
   1001             e->v.Name.ctx = ctx;
   1002             break;
   1003         case List_kind:
   1004             e->v.List.ctx = ctx;
   1005             s = e->v.List.elts;
   1006             break;
   1007         case Tuple_kind:
   1008             e->v.Tuple.ctx = ctx;
   1009             s = e->v.Tuple.elts;
   1010             break;
   1011         case Lambda_kind:
   1012             expr_name = "lambda";
   1013             break;
   1014         case Call_kind:
   1015             expr_name = "function call";
   1016             break;
   1017         case BoolOp_kind:
   1018         case BinOp_kind:
   1019         case UnaryOp_kind:
   1020             expr_name = "operator";
   1021             break;
   1022         case GeneratorExp_kind:
   1023             expr_name = "generator expression";
   1024             break;
   1025         case Yield_kind:
   1026         case YieldFrom_kind:
   1027             expr_name = "yield expression";
   1028             break;
   1029         case Await_kind:
   1030             expr_name = "await expression";
   1031             break;
   1032         case ListComp_kind:
   1033             expr_name = "list comprehension";
   1034             break;
   1035         case SetComp_kind:
   1036             expr_name = "set comprehension";
   1037             break;
   1038         case DictComp_kind:
   1039             expr_name = "dict comprehension";
   1040             break;
   1041         case Dict_kind:
   1042         case Set_kind:
   1043         case Num_kind:
   1044         case Str_kind:
   1045         case Bytes_kind:
   1046         case JoinedStr_kind:
   1047         case FormattedValue_kind:
   1048             expr_name = "literal";
   1049             break;
   1050         case NameConstant_kind:
   1051             expr_name = "keyword";
   1052             break;
   1053         case Ellipsis_kind:
   1054             expr_name = "Ellipsis";
   1055             break;
   1056         case Compare_kind:
   1057             expr_name = "comparison";
   1058             break;
   1059         case IfExp_kind:
   1060             expr_name = "conditional expression";
   1061             break;
   1062         default:
   1063             PyErr_Format(PyExc_SystemError,
   1064                          "unexpected expression in assignment %d (line %d)",
   1065                          e->kind, e->lineno);
   1066             return 0;
   1067     }
   1068     /* Check for error string set by switch */
   1069     if (expr_name) {
   1070         char buf[300];
   1071         PyOS_snprintf(buf, sizeof(buf),
   1072                       "can't %s %s",
   1073                       ctx == Store ? "assign to" : "delete",
   1074                       expr_name);
   1075         return ast_error(c, n, buf);
   1076     }
   1077 
   1078     /* If the LHS is a list or tuple, we need to set the assignment
   1079        context for all the contained elements.
   1080     */
   1081     if (s) {
   1082         int i;
   1083 
   1084         for (i = 0; i < asdl_seq_LEN(s); i++) {
   1085             if (!set_context(c, (expr_ty)asdl_seq_GET(s, i), ctx, n))
   1086                 return 0;
   1087         }
   1088     }
   1089     return 1;
   1090 }
   1091 
   1092 static operator_ty
   1093 ast_for_augassign(struct compiling *c, const node *n)
   1094 {
   1095     REQ(n, augassign);
   1096     n = CHILD(n, 0);
   1097     switch (STR(n)[0]) {
   1098         case '+':
   1099             return Add;
   1100         case '-':
   1101             return Sub;
   1102         case '/':
   1103             if (STR(n)[1] == '/')
   1104                 return FloorDiv;
   1105             else
   1106                 return Div;
   1107         case '%':
   1108             return Mod;
   1109         case '<':
   1110             return LShift;
   1111         case '>':
   1112             return RShift;
   1113         case '&':
   1114             return BitAnd;
   1115         case '^':
   1116             return BitXor;
   1117         case '|':
   1118             return BitOr;
   1119         case '*':
   1120             if (STR(n)[1] == '*')
   1121                 return Pow;
   1122             else
   1123                 return Mult;
   1124         case '@':
   1125             return MatMult;
   1126         default:
   1127             PyErr_Format(PyExc_SystemError, "invalid augassign: %s", STR(n));
   1128             return (operator_ty)0;
   1129     }
   1130 }
   1131 
   1132 static cmpop_ty
   1133 ast_for_comp_op(struct compiling *c, const node *n)
   1134 {
   1135     /* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'
   1136                |'is' 'not'
   1137     */
   1138     REQ(n, comp_op);
   1139     if (NCH(n) == 1) {
   1140         n = CHILD(n, 0);
   1141         switch (TYPE(n)) {
   1142             case LESS:
   1143                 return Lt;
   1144             case GREATER:
   1145                 return Gt;
   1146             case EQEQUAL:                       /* == */
   1147                 return Eq;
   1148             case LESSEQUAL:
   1149                 return LtE;
   1150             case GREATEREQUAL:
   1151                 return GtE;
   1152             case NOTEQUAL:
   1153                 return NotEq;
   1154             case NAME:
   1155                 if (strcmp(STR(n), "in") == 0)
   1156                     return In;
   1157                 if (strcmp(STR(n), "is") == 0)
   1158                     return Is;
   1159                 /* fall through */
   1160             default:
   1161                 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s",
   1162                              STR(n));
   1163                 return (cmpop_ty)0;
   1164         }
   1165     }
   1166     else if (NCH(n) == 2) {
   1167         /* handle "not in" and "is not" */
   1168         switch (TYPE(CHILD(n, 0))) {
   1169             case NAME:
   1170                 if (strcmp(STR(CHILD(n, 1)), "in") == 0)
   1171                     return NotIn;
   1172                 if (strcmp(STR(CHILD(n, 0)), "is") == 0)
   1173                     return IsNot;
   1174                 /* fall through */
   1175             default:
   1176                 PyErr_Format(PyExc_SystemError, "invalid comp_op: %s %s",
   1177                              STR(CHILD(n, 0)), STR(CHILD(n, 1)));
   1178                 return (cmpop_ty)0;
   1179         }
   1180     }
   1181     PyErr_Format(PyExc_SystemError, "invalid comp_op: has %d children",
   1182                  NCH(n));
   1183     return (cmpop_ty)0;
   1184 }
   1185 
   1186 static asdl_seq *
   1187 seq_for_testlist(struct compiling *c, const node *n)
   1188 {
   1189     /* testlist: test (',' test)* [',']
   1190        testlist_star_expr: test|star_expr (',' test|star_expr)* [',']
   1191     */
   1192     asdl_seq *seq;
   1193     expr_ty expression;
   1194     int i;
   1195     assert(TYPE(n) == testlist || TYPE(n) == testlist_star_expr || TYPE(n) == testlist_comp);
   1196 
   1197     seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
   1198     if (!seq)
   1199         return NULL;
   1200 
   1201     for (i = 0; i < NCH(n); i += 2) {
   1202         const node *ch = CHILD(n, i);
   1203         assert(TYPE(ch) == test || TYPE(ch) == test_nocond || TYPE(ch) == star_expr);
   1204 
   1205         expression = ast_for_expr(c, ch);
   1206         if (!expression)
   1207             return NULL;
   1208 
   1209         assert(i / 2 < seq->size);
   1210         asdl_seq_SET(seq, i / 2, expression);
   1211     }
   1212     return seq;
   1213 }
   1214 
   1215 static arg_ty
   1216 ast_for_arg(struct compiling *c, const node *n)
   1217 {
   1218     identifier name;
   1219     expr_ty annotation = NULL;
   1220     node *ch;
   1221     arg_ty ret;
   1222 
   1223     assert(TYPE(n) == tfpdef || TYPE(n) == vfpdef);
   1224     ch = CHILD(n, 0);
   1225     name = NEW_IDENTIFIER(ch);
   1226     if (!name)
   1227         return NULL;
   1228     if (forbidden_name(c, name, ch, 0))
   1229         return NULL;
   1230 
   1231     if (NCH(n) == 3 && TYPE(CHILD(n, 1)) == COLON) {
   1232         annotation = ast_for_expr(c, CHILD(n, 2));
   1233         if (!annotation)
   1234             return NULL;
   1235     }
   1236 
   1237     ret = arg(name, annotation, LINENO(n), n->n_col_offset, c->c_arena);
   1238     if (!ret)
   1239         return NULL;
   1240     return ret;
   1241 }
   1242 
   1243 /* returns -1 if failed to handle keyword only arguments
   1244    returns new position to keep processing if successful
   1245                (',' tfpdef ['=' test])*
   1246                      ^^^
   1247    start pointing here
   1248  */
   1249 static int
   1250 handle_keywordonly_args(struct compiling *c, const node *n, int start,
   1251                         asdl_seq *kwonlyargs, asdl_seq *kwdefaults)
   1252 {
   1253     PyObject *argname;
   1254     node *ch;
   1255     expr_ty expression, annotation;
   1256     arg_ty arg;
   1257     int i = start;
   1258     int j = 0; /* index for kwdefaults and kwonlyargs */
   1259 
   1260     if (kwonlyargs == NULL) {
   1261         ast_error(c, CHILD(n, start), "named arguments must follow bare *");
   1262         return -1;
   1263     }
   1264     assert(kwdefaults != NULL);
   1265     while (i < NCH(n)) {
   1266         ch = CHILD(n, i);
   1267         switch (TYPE(ch)) {
   1268             case vfpdef:
   1269             case tfpdef:
   1270                 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
   1271                     expression = ast_for_expr(c, CHILD(n, i + 2));
   1272                     if (!expression)
   1273                         goto error;
   1274                     asdl_seq_SET(kwdefaults, j, expression);
   1275                     i += 2; /* '=' and test */
   1276                 }
   1277                 else { /* setting NULL if no default value exists */
   1278                     asdl_seq_SET(kwdefaults, j, NULL);
   1279                 }
   1280                 if (NCH(ch) == 3) {
   1281                     /* ch is NAME ':' test */
   1282                     annotation = ast_for_expr(c, CHILD(ch, 2));
   1283                     if (!annotation)
   1284                         goto error;
   1285                 }
   1286                 else {
   1287                     annotation = NULL;
   1288                 }
   1289                 ch = CHILD(ch, 0);
   1290                 argname = NEW_IDENTIFIER(ch);
   1291                 if (!argname)
   1292                     goto error;
   1293                 if (forbidden_name(c, argname, ch, 0))
   1294                     goto error;
   1295                 arg = arg(argname, annotation, LINENO(ch), ch->n_col_offset,
   1296                           c->c_arena);
   1297                 if (!arg)
   1298                     goto error;
   1299                 asdl_seq_SET(kwonlyargs, j++, arg);
   1300                 i += 2; /* the name and the comma */
   1301                 break;
   1302             case DOUBLESTAR:
   1303                 return i;
   1304             default:
   1305                 ast_error(c, ch, "unexpected node");
   1306                 goto error;
   1307         }
   1308     }
   1309     return i;
   1310  error:
   1311     return -1;
   1312 }
   1313 
   1314 /* Create AST for argument list. */
   1315 
   1316 static arguments_ty
   1317 ast_for_arguments(struct compiling *c, const node *n)
   1318 {
   1319     /* This function handles both typedargslist (function definition)
   1320        and varargslist (lambda definition).
   1321 
   1322        parameters: '(' [typedargslist] ')'
   1323        typedargslist: (tfpdef ['=' test] (',' tfpdef ['=' test])* [',' [
   1324                '*' [tfpdef] (',' tfpdef ['=' test])* [',' ['**' tfpdef [',']]]
   1325              | '**' tfpdef [',']]]
   1326          | '*' [tfpdef] (',' tfpdef ['=' test])* [',' ['**' tfpdef [',']]]
   1327          | '**' tfpdef [','])
   1328        tfpdef: NAME [':' test]
   1329        varargslist: (vfpdef ['=' test] (',' vfpdef ['=' test])* [',' [
   1330                '*' [vfpdef] (',' vfpdef ['=' test])* [',' ['**' vfpdef [',']]]
   1331              | '**' vfpdef [',']]]
   1332          | '*' [vfpdef] (',' vfpdef ['=' test])* [',' ['**' vfpdef [',']]]
   1333          | '**' vfpdef [',']
   1334        )
   1335        vfpdef: NAME
   1336 
   1337     */
   1338     int i, j, k, nposargs = 0, nkwonlyargs = 0;
   1339     int nposdefaults = 0, found_default = 0;
   1340     asdl_seq *posargs, *posdefaults, *kwonlyargs, *kwdefaults;
   1341     arg_ty vararg = NULL, kwarg = NULL;
   1342     arg_ty arg;
   1343     node *ch;
   1344 
   1345     if (TYPE(n) == parameters) {
   1346         if (NCH(n) == 2) /* () as argument list */
   1347             return arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
   1348         n = CHILD(n, 1);
   1349     }
   1350     assert(TYPE(n) == typedargslist || TYPE(n) == varargslist);
   1351 
   1352     /* First count the number of positional args & defaults.  The
   1353        variable i is the loop index for this for loop and the next.
   1354        The next loop picks up where the first leaves off.
   1355     */
   1356     for (i = 0; i < NCH(n); i++) {
   1357         ch = CHILD(n, i);
   1358         if (TYPE(ch) == STAR) {
   1359             /* skip star */
   1360             i++;
   1361             if (i < NCH(n) && /* skip argument following star */
   1362                 (TYPE(CHILD(n, i)) == tfpdef ||
   1363                  TYPE(CHILD(n, i)) == vfpdef)) {
   1364                 i++;
   1365             }
   1366             break;
   1367         }
   1368         if (TYPE(ch) == DOUBLESTAR) break;
   1369         if (TYPE(ch) == vfpdef || TYPE(ch) == tfpdef) nposargs++;
   1370         if (TYPE(ch) == EQUAL) nposdefaults++;
   1371     }
   1372     /* count the number of keyword only args &
   1373        defaults for keyword only args */
   1374     for ( ; i < NCH(n); ++i) {
   1375         ch = CHILD(n, i);
   1376         if (TYPE(ch) == DOUBLESTAR) break;
   1377         if (TYPE(ch) == tfpdef || TYPE(ch) == vfpdef) nkwonlyargs++;
   1378     }
   1379     posargs = (nposargs ? _Py_asdl_seq_new(nposargs, c->c_arena) : NULL);
   1380     if (!posargs && nposargs)
   1381         return NULL;
   1382     kwonlyargs = (nkwonlyargs ?
   1383                    _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
   1384     if (!kwonlyargs && nkwonlyargs)
   1385         return NULL;
   1386     posdefaults = (nposdefaults ?
   1387                     _Py_asdl_seq_new(nposdefaults, c->c_arena) : NULL);
   1388     if (!posdefaults && nposdefaults)
   1389         return NULL;
   1390     /* The length of kwonlyargs and kwdefaults are same
   1391        since we set NULL as default for keyword only argument w/o default
   1392        - we have sequence data structure, but no dictionary */
   1393     kwdefaults = (nkwonlyargs ?
   1394                    _Py_asdl_seq_new(nkwonlyargs, c->c_arena) : NULL);
   1395     if (!kwdefaults && nkwonlyargs)
   1396         return NULL;
   1397 
   1398     /* tfpdef: NAME [':' test]
   1399        vfpdef: NAME
   1400     */
   1401     i = 0;
   1402     j = 0;  /* index for defaults */
   1403     k = 0;  /* index for args */
   1404     while (i < NCH(n)) {
   1405         ch = CHILD(n, i);
   1406         switch (TYPE(ch)) {
   1407             case tfpdef:
   1408             case vfpdef:
   1409                 /* XXX Need to worry about checking if TYPE(CHILD(n, i+1)) is
   1410                    anything other than EQUAL or a comma? */
   1411                 /* XXX Should NCH(n) check be made a separate check? */
   1412                 if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) {
   1413                     expr_ty expression = ast_for_expr(c, CHILD(n, i + 2));
   1414                     if (!expression)
   1415                         return NULL;
   1416                     assert(posdefaults != NULL);
   1417                     asdl_seq_SET(posdefaults, j++, expression);
   1418                     i += 2;
   1419                     found_default = 1;
   1420                 }
   1421                 else if (found_default) {
   1422                     ast_error(c, n,
   1423                              "non-default argument follows default argument");
   1424                     return NULL;
   1425                 }
   1426                 arg = ast_for_arg(c, ch);
   1427                 if (!arg)
   1428                     return NULL;
   1429                 asdl_seq_SET(posargs, k++, arg);
   1430                 i += 2; /* the name and the comma */
   1431                 break;
   1432             case STAR:
   1433                 if (i+1 >= NCH(n) ||
   1434                     (i+2 == NCH(n) && TYPE(CHILD(n, i+1)) == COMMA)) {
   1435                     ast_error(c, CHILD(n, i),
   1436                         "named arguments must follow bare *");
   1437                     return NULL;
   1438                 }
   1439                 ch = CHILD(n, i+1);  /* tfpdef or COMMA */
   1440                 if (TYPE(ch) == COMMA) {
   1441                     int res = 0;
   1442                     i += 2; /* now follows keyword only arguments */
   1443                     res = handle_keywordonly_args(c, n, i,
   1444                                                   kwonlyargs, kwdefaults);
   1445                     if (res == -1) return NULL;
   1446                     i = res; /* res has new position to process */
   1447                 }
   1448                 else {
   1449                     vararg = ast_for_arg(c, ch);
   1450                     if (!vararg)
   1451                         return NULL;
   1452 
   1453                     i += 3;
   1454                     if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef
   1455                                     || TYPE(CHILD(n, i)) == vfpdef)) {
   1456                         int res = 0;
   1457                         res = handle_keywordonly_args(c, n, i,
   1458                                                       kwonlyargs, kwdefaults);
   1459                         if (res == -1) return NULL;
   1460                         i = res; /* res has new position to process */
   1461                     }
   1462                 }
   1463                 break;
   1464             case DOUBLESTAR:
   1465                 ch = CHILD(n, i+1);  /* tfpdef */
   1466                 assert(TYPE(ch) == tfpdef || TYPE(ch) == vfpdef);
   1467                 kwarg = ast_for_arg(c, ch);
   1468                 if (!kwarg)
   1469                     return NULL;
   1470                 i += 3;
   1471                 break;
   1472             default:
   1473                 PyErr_Format(PyExc_SystemError,
   1474                              "unexpected node in varargslist: %d @ %d",
   1475                              TYPE(ch), i);
   1476                 return NULL;
   1477         }
   1478     }
   1479     return arguments(posargs, vararg, kwonlyargs, kwdefaults, kwarg, posdefaults, c->c_arena);
   1480 }
   1481 
   1482 static expr_ty
   1483 ast_for_dotted_name(struct compiling *c, const node *n)
   1484 {
   1485     expr_ty e;
   1486     identifier id;
   1487     int lineno, col_offset;
   1488     int i;
   1489 
   1490     REQ(n, dotted_name);
   1491 
   1492     lineno = LINENO(n);
   1493     col_offset = n->n_col_offset;
   1494 
   1495     id = NEW_IDENTIFIER(CHILD(n, 0));
   1496     if (!id)
   1497         return NULL;
   1498     e = Name(id, Load, lineno, col_offset, c->c_arena);
   1499     if (!e)
   1500         return NULL;
   1501 
   1502     for (i = 2; i < NCH(n); i+=2) {
   1503         id = NEW_IDENTIFIER(CHILD(n, i));
   1504         if (!id)
   1505             return NULL;
   1506         e = Attribute(e, id, Load, lineno, col_offset, c->c_arena);
   1507         if (!e)
   1508             return NULL;
   1509     }
   1510 
   1511     return e;
   1512 }
   1513 
   1514 static expr_ty
   1515 ast_for_decorator(struct compiling *c, const node *n)
   1516 {
   1517     /* decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE */
   1518     expr_ty d = NULL;
   1519     expr_ty name_expr;
   1520 
   1521     REQ(n, decorator);
   1522     REQ(CHILD(n, 0), AT);
   1523     REQ(RCHILD(n, -1), NEWLINE);
   1524 
   1525     name_expr = ast_for_dotted_name(c, CHILD(n, 1));
   1526     if (!name_expr)
   1527         return NULL;
   1528 
   1529     if (NCH(n) == 3) { /* No arguments */
   1530         d = name_expr;
   1531         name_expr = NULL;
   1532     }
   1533     else if (NCH(n) == 5) { /* Call with no arguments */
   1534         d = Call(name_expr, NULL, NULL, LINENO(n),
   1535                  n->n_col_offset, c->c_arena);
   1536         if (!d)
   1537             return NULL;
   1538         name_expr = NULL;
   1539     }
   1540     else {
   1541         d = ast_for_call(c, CHILD(n, 3), name_expr, true);
   1542         if (!d)
   1543             return NULL;
   1544         name_expr = NULL;
   1545     }
   1546 
   1547     return d;
   1548 }
   1549 
   1550 static asdl_seq*
   1551 ast_for_decorators(struct compiling *c, const node *n)
   1552 {
   1553     asdl_seq* decorator_seq;
   1554     expr_ty d;
   1555     int i;
   1556 
   1557     REQ(n, decorators);
   1558     decorator_seq = _Py_asdl_seq_new(NCH(n), c->c_arena);
   1559     if (!decorator_seq)
   1560         return NULL;
   1561 
   1562     for (i = 0; i < NCH(n); i++) {
   1563         d = ast_for_decorator(c, CHILD(n, i));
   1564         if (!d)
   1565             return NULL;
   1566         asdl_seq_SET(decorator_seq, i, d);
   1567     }
   1568     return decorator_seq;
   1569 }
   1570 
   1571 static stmt_ty
   1572 ast_for_funcdef_impl(struct compiling *c, const node *n0,
   1573                      asdl_seq *decorator_seq, bool is_async)
   1574 {
   1575     /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
   1576     const node * const n = is_async ? CHILD(n0, 1) : n0;
   1577     identifier name;
   1578     arguments_ty args;
   1579     asdl_seq *body;
   1580     expr_ty returns = NULL;
   1581     int name_i = 1;
   1582 
   1583     REQ(n, funcdef);
   1584 
   1585     name = NEW_IDENTIFIER(CHILD(n, name_i));
   1586     if (!name)
   1587         return NULL;
   1588     if (forbidden_name(c, name, CHILD(n, name_i), 0))
   1589         return NULL;
   1590     args = ast_for_arguments(c, CHILD(n, name_i + 1));
   1591     if (!args)
   1592         return NULL;
   1593     if (TYPE(CHILD(n, name_i+2)) == RARROW) {
   1594         returns = ast_for_expr(c, CHILD(n, name_i + 3));
   1595         if (!returns)
   1596             return NULL;
   1597         name_i += 2;
   1598     }
   1599     body = ast_for_suite(c, CHILD(n, name_i + 3));
   1600     if (!body)
   1601         return NULL;
   1602 
   1603     if (is_async)
   1604         return AsyncFunctionDef(name, args, body, decorator_seq, returns,
   1605                                 LINENO(n0), n0->n_col_offset, c->c_arena);
   1606     else
   1607         return FunctionDef(name, args, body, decorator_seq, returns,
   1608                            LINENO(n), n->n_col_offset, c->c_arena);
   1609 }
   1610 
   1611 static stmt_ty
   1612 ast_for_async_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
   1613 {
   1614     /* async_funcdef: 'async' funcdef */
   1615     REQ(n, async_funcdef);
   1616     REQ(CHILD(n, 0), NAME);
   1617     assert(strcmp(STR(CHILD(n, 0)), "async") == 0);
   1618     REQ(CHILD(n, 1), funcdef);
   1619 
   1620     return ast_for_funcdef_impl(c, n, decorator_seq,
   1621                                 true /* is_async */);
   1622 }
   1623 
   1624 static stmt_ty
   1625 ast_for_funcdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
   1626 {
   1627     /* funcdef: 'def' NAME parameters ['->' test] ':' suite */
   1628     return ast_for_funcdef_impl(c, n, decorator_seq,
   1629                                 false /* is_async */);
   1630 }
   1631 
   1632 
   1633 static stmt_ty
   1634 ast_for_async_stmt(struct compiling *c, const node *n)
   1635 {
   1636     /* async_stmt: 'async' (funcdef | with_stmt | for_stmt) */
   1637     REQ(n, async_stmt);
   1638     REQ(CHILD(n, 0), NAME);
   1639     assert(strcmp(STR(CHILD(n, 0)), "async") == 0);
   1640 
   1641     switch (TYPE(CHILD(n, 1))) {
   1642         case funcdef:
   1643             return ast_for_funcdef_impl(c, n, NULL,
   1644                                         true /* is_async */);
   1645         case with_stmt:
   1646             return ast_for_with_stmt(c, n,
   1647                                      true /* is_async */);
   1648 
   1649         case for_stmt:
   1650             return ast_for_for_stmt(c, n,
   1651                                     true /* is_async */);
   1652 
   1653         default:
   1654             PyErr_Format(PyExc_SystemError,
   1655                          "invalid async stament: %s",
   1656                          STR(CHILD(n, 1)));
   1657             return NULL;
   1658     }
   1659 }
   1660 
   1661 static stmt_ty
   1662 ast_for_decorated(struct compiling *c, const node *n)
   1663 {
   1664     /* decorated: decorators (classdef | funcdef | async_funcdef) */
   1665     stmt_ty thing = NULL;
   1666     asdl_seq *decorator_seq = NULL;
   1667 
   1668     REQ(n, decorated);
   1669 
   1670     decorator_seq = ast_for_decorators(c, CHILD(n, 0));
   1671     if (!decorator_seq)
   1672       return NULL;
   1673 
   1674     assert(TYPE(CHILD(n, 1)) == funcdef ||
   1675            TYPE(CHILD(n, 1)) == async_funcdef ||
   1676            TYPE(CHILD(n, 1)) == classdef);
   1677 
   1678     if (TYPE(CHILD(n, 1)) == funcdef) {
   1679       thing = ast_for_funcdef(c, CHILD(n, 1), decorator_seq);
   1680     } else if (TYPE(CHILD(n, 1)) == classdef) {
   1681       thing = ast_for_classdef(c, CHILD(n, 1), decorator_seq);
   1682     } else if (TYPE(CHILD(n, 1)) == async_funcdef) {
   1683       thing = ast_for_async_funcdef(c, CHILD(n, 1), decorator_seq);
   1684     }
   1685     /* we count the decorators in when talking about the class' or
   1686      * function's line number */
   1687     if (thing) {
   1688         thing->lineno = LINENO(n);
   1689         thing->col_offset = n->n_col_offset;
   1690     }
   1691     return thing;
   1692 }
   1693 
   1694 static expr_ty
   1695 ast_for_lambdef(struct compiling *c, const node *n)
   1696 {
   1697     /* lambdef: 'lambda' [varargslist] ':' test
   1698        lambdef_nocond: 'lambda' [varargslist] ':' test_nocond */
   1699     arguments_ty args;
   1700     expr_ty expression;
   1701 
   1702     if (NCH(n) == 3) {
   1703         args = arguments(NULL, NULL, NULL, NULL, NULL, NULL, c->c_arena);
   1704         if (!args)
   1705             return NULL;
   1706         expression = ast_for_expr(c, CHILD(n, 2));
   1707         if (!expression)
   1708             return NULL;
   1709     }
   1710     else {
   1711         args = ast_for_arguments(c, CHILD(n, 1));
   1712         if (!args)
   1713             return NULL;
   1714         expression = ast_for_expr(c, CHILD(n, 3));
   1715         if (!expression)
   1716             return NULL;
   1717     }
   1718 
   1719     return Lambda(args, expression, LINENO(n), n->n_col_offset, c->c_arena);
   1720 }
   1721 
   1722 static expr_ty
   1723 ast_for_ifexpr(struct compiling *c, const node *n)
   1724 {
   1725     /* test: or_test 'if' or_test 'else' test */
   1726     expr_ty expression, body, orelse;
   1727 
   1728     assert(NCH(n) == 5);
   1729     body = ast_for_expr(c, CHILD(n, 0));
   1730     if (!body)
   1731         return NULL;
   1732     expression = ast_for_expr(c, CHILD(n, 2));
   1733     if (!expression)
   1734         return NULL;
   1735     orelse = ast_for_expr(c, CHILD(n, 4));
   1736     if (!orelse)
   1737         return NULL;
   1738     return IfExp(expression, body, orelse, LINENO(n), n->n_col_offset,
   1739                  c->c_arena);
   1740 }
   1741 
   1742 /*
   1743    Count the number of 'for' loops in a comprehension.
   1744 
   1745    Helper for ast_for_comprehension().
   1746 */
   1747 
   1748 static int
   1749 count_comp_fors(struct compiling *c, const node *n)
   1750 {
   1751     int n_fors = 0;
   1752 
   1753   count_comp_for:
   1754     n_fors++;
   1755     REQ(n, comp_for);
   1756     if (NCH(n) == 2) {
   1757         REQ(CHILD(n, 0), NAME);
   1758         assert(strcmp(STR(CHILD(n, 0)), "async") == 0);
   1759         n = CHILD(n, 1);
   1760     }
   1761     else if (NCH(n) == 1) {
   1762         n = CHILD(n, 0);
   1763     }
   1764     else {
   1765         goto error;
   1766     }
   1767     if (NCH(n) == (5)) {
   1768         n = CHILD(n, 4);
   1769     }
   1770     else {
   1771         return n_fors;
   1772     }
   1773   count_comp_iter:
   1774     REQ(n, comp_iter);
   1775     n = CHILD(n, 0);
   1776     if (TYPE(n) == comp_for)
   1777         goto count_comp_for;
   1778     else if (TYPE(n) == comp_if) {
   1779         if (NCH(n) == 3) {
   1780             n = CHILD(n, 2);
   1781             goto count_comp_iter;
   1782         }
   1783         else
   1784             return n_fors;
   1785     }
   1786 
   1787   error:
   1788     /* Should never be reached */
   1789     PyErr_SetString(PyExc_SystemError,
   1790                     "logic error in count_comp_fors");
   1791     return -1;
   1792 }
   1793 
   1794 /* Count the number of 'if' statements in a comprehension.
   1795 
   1796    Helper for ast_for_comprehension().
   1797 */
   1798 
   1799 static int
   1800 count_comp_ifs(struct compiling *c, const node *n)
   1801 {
   1802     int n_ifs = 0;
   1803 
   1804     while (1) {
   1805         REQ(n, comp_iter);
   1806         if (TYPE(CHILD(n, 0)) == comp_for)
   1807             return n_ifs;
   1808         n = CHILD(n, 0);
   1809         REQ(n, comp_if);
   1810         n_ifs++;
   1811         if (NCH(n) == 2)
   1812             return n_ifs;
   1813         n = CHILD(n, 2);
   1814     }
   1815 }
   1816 
   1817 static asdl_seq *
   1818 ast_for_comprehension(struct compiling *c, const node *n)
   1819 {
   1820     int i, n_fors;
   1821     asdl_seq *comps;
   1822 
   1823     n_fors = count_comp_fors(c, n);
   1824     if (n_fors == -1)
   1825         return NULL;
   1826 
   1827     comps = _Py_asdl_seq_new(n_fors, c->c_arena);
   1828     if (!comps)
   1829         return NULL;
   1830 
   1831     for (i = 0; i < n_fors; i++) {
   1832         comprehension_ty comp;
   1833         asdl_seq *t;
   1834         expr_ty expression, first;
   1835         node *for_ch;
   1836         node *sync_n;
   1837         int is_async = 0;
   1838 
   1839         REQ(n, comp_for);
   1840 
   1841         if (NCH(n) == 2) {
   1842             is_async = 1;
   1843             REQ(CHILD(n, 0), NAME);
   1844             assert(strcmp(STR(CHILD(n, 0)), "async") == 0);
   1845             sync_n = CHILD(n, 1);
   1846         }
   1847         else {
   1848             sync_n = CHILD(n, 0);
   1849         }
   1850         REQ(sync_n, sync_comp_for);
   1851 
   1852         for_ch = CHILD(sync_n, 1);
   1853         t = ast_for_exprlist(c, for_ch, Store);
   1854         if (!t)
   1855             return NULL;
   1856         expression = ast_for_expr(c, CHILD(sync_n, 3));
   1857         if (!expression)
   1858             return NULL;
   1859 
   1860         /* Check the # of children rather than the length of t, since
   1861            (x for x, in ...) has 1 element in t, but still requires a Tuple. */
   1862         first = (expr_ty)asdl_seq_GET(t, 0);
   1863         if (NCH(for_ch) == 1)
   1864             comp = comprehension(first, expression, NULL,
   1865                                  is_async, c->c_arena);
   1866         else
   1867             comp = comprehension(Tuple(t, Store, first->lineno,
   1868                                        first->col_offset, c->c_arena),
   1869                                  expression, NULL, is_async, c->c_arena);
   1870         if (!comp)
   1871             return NULL;
   1872 
   1873         if (NCH(sync_n) == 5) {
   1874             int j, n_ifs;
   1875             asdl_seq *ifs;
   1876 
   1877             n = CHILD(sync_n, 4);
   1878             n_ifs = count_comp_ifs(c, n);
   1879             if (n_ifs == -1)
   1880                 return NULL;
   1881 
   1882             ifs = _Py_asdl_seq_new(n_ifs, c->c_arena);
   1883             if (!ifs)
   1884                 return NULL;
   1885 
   1886             for (j = 0; j < n_ifs; j++) {
   1887                 REQ(n, comp_iter);
   1888                 n = CHILD(n, 0);
   1889                 REQ(n, comp_if);
   1890 
   1891                 expression = ast_for_expr(c, CHILD(n, 1));
   1892                 if (!expression)
   1893                     return NULL;
   1894                 asdl_seq_SET(ifs, j, expression);
   1895                 if (NCH(n) == 3)
   1896                     n = CHILD(n, 2);
   1897             }
   1898             /* on exit, must guarantee that n is a comp_for */
   1899             if (TYPE(n) == comp_iter)
   1900                 n = CHILD(n, 0);
   1901             comp->ifs = ifs;
   1902         }
   1903         asdl_seq_SET(comps, i, comp);
   1904     }
   1905     return comps;
   1906 }
   1907 
   1908 static expr_ty
   1909 ast_for_itercomp(struct compiling *c, const node *n, int type)
   1910 {
   1911     /* testlist_comp: (test|star_expr)
   1912      *                ( comp_for | (',' (test|star_expr))* [','] ) */
   1913     expr_ty elt;
   1914     asdl_seq *comps;
   1915     node *ch;
   1916 
   1917     assert(NCH(n) > 1);
   1918 
   1919     ch = CHILD(n, 0);
   1920     elt = ast_for_expr(c, ch);
   1921     if (!elt)
   1922         return NULL;
   1923     if (elt->kind == Starred_kind) {
   1924         ast_error(c, ch, "iterable unpacking cannot be used in comprehension");
   1925         return NULL;
   1926     }
   1927 
   1928     comps = ast_for_comprehension(c, CHILD(n, 1));
   1929     if (!comps)
   1930         return NULL;
   1931 
   1932     if (type == COMP_GENEXP)
   1933         return GeneratorExp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
   1934     else if (type == COMP_LISTCOMP)
   1935         return ListComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
   1936     else if (type == COMP_SETCOMP)
   1937         return SetComp(elt, comps, LINENO(n), n->n_col_offset, c->c_arena);
   1938     else
   1939         /* Should never happen */
   1940         return NULL;
   1941 }
   1942 
   1943 /* Fills in the key, value pair corresponding to the dict element.  In case
   1944  * of an unpacking, key is NULL.  *i is advanced by the number of ast
   1945  * elements.  Iff successful, nonzero is returned.
   1946  */
   1947 static int
   1948 ast_for_dictelement(struct compiling *c, const node *n, int *i,
   1949                     expr_ty *key, expr_ty *value)
   1950 {
   1951     expr_ty expression;
   1952     if (TYPE(CHILD(n, *i)) == DOUBLESTAR) {
   1953         assert(NCH(n) - *i >= 2);
   1954 
   1955         expression = ast_for_expr(c, CHILD(n, *i + 1));
   1956         if (!expression)
   1957             return 0;
   1958         *key = NULL;
   1959         *value = expression;
   1960 
   1961         *i += 2;
   1962     }
   1963     else {
   1964         assert(NCH(n) - *i >= 3);
   1965 
   1966         expression = ast_for_expr(c, CHILD(n, *i));
   1967         if (!expression)
   1968             return 0;
   1969         *key = expression;
   1970 
   1971         REQ(CHILD(n, *i + 1), COLON);
   1972 
   1973         expression = ast_for_expr(c, CHILD(n, *i + 2));
   1974         if (!expression)
   1975             return 0;
   1976         *value = expression;
   1977 
   1978         *i += 3;
   1979     }
   1980     return 1;
   1981 }
   1982 
   1983 static expr_ty
   1984 ast_for_dictcomp(struct compiling *c, const node *n)
   1985 {
   1986     expr_ty key, value;
   1987     asdl_seq *comps;
   1988     int i = 0;
   1989 
   1990     if (!ast_for_dictelement(c, n, &i, &key, &value))
   1991         return NULL;
   1992     assert(key);
   1993     assert(NCH(n) - i >= 1);
   1994 
   1995     comps = ast_for_comprehension(c, CHILD(n, i));
   1996     if (!comps)
   1997         return NULL;
   1998 
   1999     return DictComp(key, value, comps, LINENO(n), n->n_col_offset, c->c_arena);
   2000 }
   2001 
   2002 static expr_ty
   2003 ast_for_dictdisplay(struct compiling *c, const node *n)
   2004 {
   2005     int i;
   2006     int j;
   2007     int size;
   2008     asdl_seq *keys, *values;
   2009 
   2010     size = (NCH(n) + 1) / 3; /* +1 in case no trailing comma */
   2011     keys = _Py_asdl_seq_new(size, c->c_arena);
   2012     if (!keys)
   2013         return NULL;
   2014 
   2015     values = _Py_asdl_seq_new(size, c->c_arena);
   2016     if (!values)
   2017         return NULL;
   2018 
   2019     j = 0;
   2020     for (i = 0; i < NCH(n); i++) {
   2021         expr_ty key, value;
   2022 
   2023         if (!ast_for_dictelement(c, n, &i, &key, &value))
   2024             return NULL;
   2025         asdl_seq_SET(keys, j, key);
   2026         asdl_seq_SET(values, j, value);
   2027 
   2028         j++;
   2029     }
   2030     keys->size = j;
   2031     values->size = j;
   2032     return Dict(keys, values, LINENO(n), n->n_col_offset, c->c_arena);
   2033 }
   2034 
   2035 static expr_ty
   2036 ast_for_genexp(struct compiling *c, const node *n)
   2037 {
   2038     assert(TYPE(n) == (testlist_comp) || TYPE(n) == (argument));
   2039     return ast_for_itercomp(c, n, COMP_GENEXP);
   2040 }
   2041 
   2042 static expr_ty
   2043 ast_for_listcomp(struct compiling *c, const node *n)
   2044 {
   2045     assert(TYPE(n) == (testlist_comp));
   2046     return ast_for_itercomp(c, n, COMP_LISTCOMP);
   2047 }
   2048 
   2049 static expr_ty
   2050 ast_for_setcomp(struct compiling *c, const node *n)
   2051 {
   2052     assert(TYPE(n) == (dictorsetmaker));
   2053     return ast_for_itercomp(c, n, COMP_SETCOMP);
   2054 }
   2055 
   2056 static expr_ty
   2057 ast_for_setdisplay(struct compiling *c, const node *n)
   2058 {
   2059     int i;
   2060     int size;
   2061     asdl_seq *elts;
   2062 
   2063     assert(TYPE(n) == (dictorsetmaker));
   2064     size = (NCH(n) + 1) / 2; /* +1 in case no trailing comma */
   2065     elts = _Py_asdl_seq_new(size, c->c_arena);
   2066     if (!elts)
   2067         return NULL;
   2068     for (i = 0; i < NCH(n); i += 2) {
   2069         expr_ty expression;
   2070         expression = ast_for_expr(c, CHILD(n, i));
   2071         if (!expression)
   2072             return NULL;
   2073         asdl_seq_SET(elts, i / 2, expression);
   2074     }
   2075     return Set(elts, LINENO(n), n->n_col_offset, c->c_arena);
   2076 }
   2077 
   2078 static expr_ty
   2079 ast_for_atom(struct compiling *c, const node *n)
   2080 {
   2081     /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']'
   2082        | '{' [dictmaker|testlist_comp] '}' | NAME | NUMBER | STRING+
   2083        | '...' | 'None' | 'True' | 'False'
   2084     */
   2085     node *ch = CHILD(n, 0);
   2086 
   2087     switch (TYPE(ch)) {
   2088     case NAME: {
   2089         PyObject *name;
   2090         const char *s = STR(ch);
   2091         size_t len = strlen(s);
   2092         if (len >= 4 && len <= 5) {
   2093             if (!strcmp(s, "None"))
   2094                 return NameConstant(Py_None, LINENO(n), n->n_col_offset, c->c_arena);
   2095             if (!strcmp(s, "True"))
   2096                 return NameConstant(Py_True, LINENO(n), n->n_col_offset, c->c_arena);
   2097             if (!strcmp(s, "False"))
   2098                 return NameConstant(Py_False, LINENO(n), n->n_col_offset, c->c_arena);
   2099         }
   2100         name = new_identifier(s, c);
   2101         if (!name)
   2102             return NULL;
   2103         /* All names start in Load context, but may later be changed. */
   2104         return Name(name, Load, LINENO(n), n->n_col_offset, c->c_arena);
   2105     }
   2106     case STRING: {
   2107         expr_ty str = parsestrplus(c, n);
   2108         if (!str) {
   2109             const char *errtype = NULL;
   2110             if (PyErr_ExceptionMatches(PyExc_UnicodeError))
   2111                 errtype = "unicode error";
   2112             else if (PyErr_ExceptionMatches(PyExc_ValueError))
   2113                 errtype = "value error";
   2114             if (errtype) {
   2115                 char buf[128];
   2116                 const char *s = NULL;
   2117                 PyObject *type, *value, *tback, *errstr;
   2118                 PyErr_Fetch(&type, &value, &tback);
   2119                 errstr = PyObject_Str(value);
   2120                 if (errstr)
   2121                     s = PyUnicode_AsUTF8(errstr);
   2122                 if (s) {
   2123                     PyOS_snprintf(buf, sizeof(buf), "(%s) %s", errtype, s);
   2124                 } else {
   2125                     PyErr_Clear();
   2126                     PyOS_snprintf(buf, sizeof(buf), "(%s) unknown error", errtype);
   2127                 }
   2128                 Py_XDECREF(errstr);
   2129                 ast_error(c, n, buf);
   2130                 Py_DECREF(type);
   2131                 Py_XDECREF(value);
   2132                 Py_XDECREF(tback);
   2133             }
   2134             return NULL;
   2135         }
   2136         return str;
   2137     }
   2138     case NUMBER: {
   2139         PyObject *pynum = parsenumber(c, STR(ch));
   2140         if (!pynum)
   2141             return NULL;
   2142 
   2143         if (PyArena_AddPyObject(c->c_arena, pynum) < 0) {
   2144             Py_DECREF(pynum);
   2145             return NULL;
   2146         }
   2147         return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena);
   2148     }
   2149     case ELLIPSIS: /* Ellipsis */
   2150         return Ellipsis(LINENO(n), n->n_col_offset, c->c_arena);
   2151     case LPAR: /* some parenthesized expressions */
   2152         ch = CHILD(n, 1);
   2153 
   2154         if (TYPE(ch) == RPAR)
   2155             return Tuple(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
   2156 
   2157         if (TYPE(ch) == yield_expr)
   2158             return ast_for_expr(c, ch);
   2159 
   2160         /* testlist_comp: test ( comp_for | (',' test)* [','] ) */
   2161         if ((NCH(ch) > 1) && (TYPE(CHILD(ch, 1)) == comp_for))
   2162             return ast_for_genexp(c, ch);
   2163 
   2164         return ast_for_testlist(c, ch);
   2165     case LSQB: /* list (or list comprehension) */
   2166         ch = CHILD(n, 1);
   2167 
   2168         if (TYPE(ch) == RSQB)
   2169             return List(NULL, Load, LINENO(n), n->n_col_offset, c->c_arena);
   2170 
   2171         REQ(ch, testlist_comp);
   2172         if (NCH(ch) == 1 || TYPE(CHILD(ch, 1)) == COMMA) {
   2173             asdl_seq *elts = seq_for_testlist(c, ch);
   2174             if (!elts)
   2175                 return NULL;
   2176 
   2177             return List(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
   2178         }
   2179         else
   2180             return ast_for_listcomp(c, ch);
   2181     case LBRACE: {
   2182         /* dictorsetmaker: ( ((test ':' test | '**' test)
   2183          *                    (comp_for | (',' (test ':' test | '**' test))* [','])) |
   2184          *                   ((test | '*' test)
   2185          *                    (comp_for | (',' (test | '*' test))* [','])) ) */
   2186         expr_ty res;
   2187         ch = CHILD(n, 1);
   2188         if (TYPE(ch) == RBRACE) {
   2189             /* It's an empty dict. */
   2190             return Dict(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
   2191         }
   2192         else {
   2193             int is_dict = (TYPE(CHILD(ch, 0)) == DOUBLESTAR);
   2194             if (NCH(ch) == 1 ||
   2195                     (NCH(ch) > 1 &&
   2196                      TYPE(CHILD(ch, 1)) == COMMA)) {
   2197                 /* It's a set display. */
   2198                 res = ast_for_setdisplay(c, ch);
   2199             }
   2200             else if (NCH(ch) > 1 &&
   2201                     TYPE(CHILD(ch, 1)) == comp_for) {
   2202                 /* It's a set comprehension. */
   2203                 res = ast_for_setcomp(c, ch);
   2204             }
   2205             else if (NCH(ch) > 3 - is_dict &&
   2206                     TYPE(CHILD(ch, 3 - is_dict)) == comp_for) {
   2207                 /* It's a dictionary comprehension. */
   2208                 if (is_dict) {
   2209                     ast_error(c, n, "dict unpacking cannot be used in "
   2210                             "dict comprehension");
   2211                     return NULL;
   2212                 }
   2213                 res = ast_for_dictcomp(c, ch);
   2214             }
   2215             else {
   2216                 /* It's a dictionary display. */
   2217                 res = ast_for_dictdisplay(c, ch);
   2218             }
   2219             if (res) {
   2220                 res->lineno = LINENO(n);
   2221                 res->col_offset = n->n_col_offset;
   2222             }
   2223             return res;
   2224         }
   2225     }
   2226     default:
   2227         PyErr_Format(PyExc_SystemError, "unhandled atom %d", TYPE(ch));
   2228         return NULL;
   2229     }
   2230 }
   2231 
   2232 static slice_ty
   2233 ast_for_slice(struct compiling *c, const node *n)
   2234 {
   2235     node *ch;
   2236     expr_ty lower = NULL, upper = NULL, step = NULL;
   2237 
   2238     REQ(n, subscript);
   2239 
   2240     /*
   2241        subscript: test | [test] ':' [test] [sliceop]
   2242        sliceop: ':' [test]
   2243     */
   2244     ch = CHILD(n, 0);
   2245     if (NCH(n) == 1 && TYPE(ch) == test) {
   2246         /* 'step' variable hold no significance in terms of being used over
   2247            other vars */
   2248         step = ast_for_expr(c, ch);
   2249         if (!step)
   2250             return NULL;
   2251 
   2252         return Index(step, c->c_arena);
   2253     }
   2254 
   2255     if (TYPE(ch) == test) {
   2256         lower = ast_for_expr(c, ch);
   2257         if (!lower)
   2258             return NULL;
   2259     }
   2260 
   2261     /* If there's an upper bound it's in the second or third position. */
   2262     if (TYPE(ch) == COLON) {
   2263         if (NCH(n) > 1) {
   2264             node *n2 = CHILD(n, 1);
   2265 
   2266             if (TYPE(n2) == test) {
   2267                 upper = ast_for_expr(c, n2);
   2268                 if (!upper)
   2269                     return NULL;
   2270             }
   2271         }
   2272     } else if (NCH(n) > 2) {
   2273         node *n2 = CHILD(n, 2);
   2274 
   2275         if (TYPE(n2) == test) {
   2276             upper = ast_for_expr(c, n2);
   2277             if (!upper)
   2278                 return NULL;
   2279         }
   2280     }
   2281 
   2282     ch = CHILD(n, NCH(n) - 1);
   2283     if (TYPE(ch) == sliceop) {
   2284         if (NCH(ch) != 1) {
   2285             ch = CHILD(ch, 1);
   2286             if (TYPE(ch) == test) {
   2287                 step = ast_for_expr(c, ch);
   2288                 if (!step)
   2289                     return NULL;
   2290             }
   2291         }
   2292     }
   2293 
   2294     return Slice(lower, upper, step, c->c_arena);
   2295 }
   2296 
   2297 static expr_ty
   2298 ast_for_binop(struct compiling *c, const node *n)
   2299 {
   2300     /* Must account for a sequence of expressions.
   2301        How should A op B op C by represented?
   2302        BinOp(BinOp(A, op, B), op, C).
   2303     */
   2304 
   2305     int i, nops;
   2306     expr_ty expr1, expr2, result;
   2307     operator_ty newoperator;
   2308 
   2309     expr1 = ast_for_expr(c, CHILD(n, 0));
   2310     if (!expr1)
   2311         return NULL;
   2312 
   2313     expr2 = ast_for_expr(c, CHILD(n, 2));
   2314     if (!expr2)
   2315         return NULL;
   2316 
   2317     newoperator = get_operator(CHILD(n, 1));
   2318     if (!newoperator)
   2319         return NULL;
   2320 
   2321     result = BinOp(expr1, newoperator, expr2, LINENO(n), n->n_col_offset,
   2322                    c->c_arena);
   2323     if (!result)
   2324         return NULL;
   2325 
   2326     nops = (NCH(n) - 1) / 2;
   2327     for (i = 1; i < nops; i++) {
   2328         expr_ty tmp_result, tmp;
   2329         const node* next_oper = CHILD(n, i * 2 + 1);
   2330 
   2331         newoperator = get_operator(next_oper);
   2332         if (!newoperator)
   2333             return NULL;
   2334 
   2335         tmp = ast_for_expr(c, CHILD(n, i * 2 + 2));
   2336         if (!tmp)
   2337             return NULL;
   2338 
   2339         tmp_result = BinOp(result, newoperator, tmp,
   2340                            LINENO(next_oper), next_oper->n_col_offset,
   2341                            c->c_arena);
   2342         if (!tmp_result)
   2343             return NULL;
   2344         result = tmp_result;
   2345     }
   2346     return result;
   2347 }
   2348 
   2349 static expr_ty
   2350 ast_for_trailer(struct compiling *c, const node *n, expr_ty left_expr)
   2351 {
   2352     /* trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
   2353        subscriptlist: subscript (',' subscript)* [',']
   2354        subscript: '.' '.' '.' | test | [test] ':' [test] [sliceop]
   2355      */
   2356     REQ(n, trailer);
   2357     if (TYPE(CHILD(n, 0)) == LPAR) {
   2358         if (NCH(n) == 2)
   2359             return Call(left_expr, NULL, NULL, LINENO(n),
   2360                         n->n_col_offset, c->c_arena);
   2361         else
   2362             return ast_for_call(c, CHILD(n, 1), left_expr, true);
   2363     }
   2364     else if (TYPE(CHILD(n, 0)) == DOT) {
   2365         PyObject *attr_id = NEW_IDENTIFIER(CHILD(n, 1));
   2366         if (!attr_id)
   2367             return NULL;
   2368         return Attribute(left_expr, attr_id, Load,
   2369                          LINENO(n), n->n_col_offset, c->c_arena);
   2370     }
   2371     else {
   2372         REQ(CHILD(n, 0), LSQB);
   2373         REQ(CHILD(n, 2), RSQB);
   2374         n = CHILD(n, 1);
   2375         if (NCH(n) == 1) {
   2376             slice_ty slc = ast_for_slice(c, CHILD(n, 0));
   2377             if (!slc)
   2378                 return NULL;
   2379             return Subscript(left_expr, slc, Load, LINENO(n), n->n_col_offset,
   2380                              c->c_arena);
   2381         }
   2382         else {
   2383             /* The grammar is ambiguous here. The ambiguity is resolved
   2384                by treating the sequence as a tuple literal if there are
   2385                no slice features.
   2386             */
   2387             int j;
   2388             slice_ty slc;
   2389             expr_ty e;
   2390             int simple = 1;
   2391             asdl_seq *slices, *elts;
   2392             slices = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
   2393             if (!slices)
   2394                 return NULL;
   2395             for (j = 0; j < NCH(n); j += 2) {
   2396                 slc = ast_for_slice(c, CHILD(n, j));
   2397                 if (!slc)
   2398                     return NULL;
   2399                 if (slc->kind != Index_kind)
   2400                     simple = 0;
   2401                 asdl_seq_SET(slices, j / 2, slc);
   2402             }
   2403             if (!simple) {
   2404                 return Subscript(left_expr, ExtSlice(slices, c->c_arena),
   2405                                  Load, LINENO(n), n->n_col_offset, c->c_arena);
   2406             }
   2407             /* extract Index values and put them in a Tuple */
   2408             elts = _Py_asdl_seq_new(asdl_seq_LEN(slices), c->c_arena);
   2409             if (!elts)
   2410                 return NULL;
   2411             for (j = 0; j < asdl_seq_LEN(slices); ++j) {
   2412                 slc = (slice_ty)asdl_seq_GET(slices, j);
   2413                 assert(slc->kind == Index_kind  && slc->v.Index.value);
   2414                 asdl_seq_SET(elts, j, slc->v.Index.value);
   2415             }
   2416             e = Tuple(elts, Load, LINENO(n), n->n_col_offset, c->c_arena);
   2417             if (!e)
   2418                 return NULL;
   2419             return Subscript(left_expr, Index(e, c->c_arena),
   2420                              Load, LINENO(n), n->n_col_offset, c->c_arena);
   2421         }
   2422     }
   2423 }
   2424 
   2425 static expr_ty
   2426 ast_for_factor(struct compiling *c, const node *n)
   2427 {
   2428     expr_ty expression;
   2429 
   2430     expression = ast_for_expr(c, CHILD(n, 1));
   2431     if (!expression)
   2432         return NULL;
   2433 
   2434     switch (TYPE(CHILD(n, 0))) {
   2435         case PLUS:
   2436             return UnaryOp(UAdd, expression, LINENO(n), n->n_col_offset,
   2437                            c->c_arena);
   2438         case MINUS:
   2439             return UnaryOp(USub, expression, LINENO(n), n->n_col_offset,
   2440                            c->c_arena);
   2441         case TILDE:
   2442             return UnaryOp(Invert, expression, LINENO(n),
   2443                            n->n_col_offset, c->c_arena);
   2444     }
   2445     PyErr_Format(PyExc_SystemError, "unhandled factor: %d",
   2446                  TYPE(CHILD(n, 0)));
   2447     return NULL;
   2448 }
   2449 
   2450 static expr_ty
   2451 ast_for_atom_expr(struct compiling *c, const node *n)
   2452 {
   2453     int i, nch, start = 0;
   2454     expr_ty e, tmp;
   2455 
   2456     REQ(n, atom_expr);
   2457     nch = NCH(n);
   2458 
   2459     if (TYPE(CHILD(n, 0)) == NAME && strcmp(STR(CHILD(n, 0)), "await") == 0) {
   2460         start = 1;
   2461         assert(nch > 1);
   2462     }
   2463 
   2464     e = ast_for_atom(c, CHILD(n, start));
   2465     if (!e)
   2466         return NULL;
   2467     if (nch == 1)
   2468         return e;
   2469     if (start && nch == 2) {
   2470         return Await(e, LINENO(n), n->n_col_offset, c->c_arena);
   2471     }
   2472 
   2473     for (i = start + 1; i < nch; i++) {
   2474         node *ch = CHILD(n, i);
   2475         if (TYPE(ch) != trailer)
   2476             break;
   2477         tmp = ast_for_trailer(c, ch, e);
   2478         if (!tmp)
   2479             return NULL;
   2480         tmp->lineno = e->lineno;
   2481         tmp->col_offset = e->col_offset;
   2482         e = tmp;
   2483     }
   2484 
   2485     if (start) {
   2486         /* there was an 'await' */
   2487         return Await(e, LINENO(n), n->n_col_offset, c->c_arena);
   2488     }
   2489     else {
   2490         return e;
   2491     }
   2492 }
   2493 
   2494 static expr_ty
   2495 ast_for_power(struct compiling *c, const node *n)
   2496 {
   2497     /* power: atom trailer* ('**' factor)*
   2498      */
   2499     expr_ty e;
   2500     REQ(n, power);
   2501     e = ast_for_atom_expr(c, CHILD(n, 0));
   2502     if (!e)
   2503         return NULL;
   2504     if (NCH(n) == 1)
   2505         return e;
   2506     if (TYPE(CHILD(n, NCH(n) - 1)) == factor) {
   2507         expr_ty f = ast_for_expr(c, CHILD(n, NCH(n) - 1));
   2508         if (!f)
   2509             return NULL;
   2510         e = BinOp(e, Pow, f, LINENO(n), n->n_col_offset, c->c_arena);
   2511     }
   2512     return e;
   2513 }
   2514 
   2515 static expr_ty
   2516 ast_for_starred(struct compiling *c, const node *n)
   2517 {
   2518     expr_ty tmp;
   2519     REQ(n, star_expr);
   2520 
   2521     tmp = ast_for_expr(c, CHILD(n, 1));
   2522     if (!tmp)
   2523         return NULL;
   2524 
   2525     /* The Load context is changed later. */
   2526     return Starred(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
   2527 }
   2528 
   2529 
   2530 /* Do not name a variable 'expr'!  Will cause a compile error.
   2531 */
   2532 
   2533 static expr_ty
   2534 ast_for_expr(struct compiling *c, const node *n)
   2535 {
   2536     /* handle the full range of simple expressions
   2537        test: or_test ['if' or_test 'else' test] | lambdef
   2538        test_nocond: or_test | lambdef_nocond
   2539        or_test: and_test ('or' and_test)*
   2540        and_test: not_test ('and' not_test)*
   2541        not_test: 'not' not_test | comparison
   2542        comparison: expr (comp_op expr)*
   2543        expr: xor_expr ('|' xor_expr)*
   2544        xor_expr: and_expr ('^' and_expr)*
   2545        and_expr: shift_expr ('&' shift_expr)*
   2546        shift_expr: arith_expr (('<<'|'>>') arith_expr)*
   2547        arith_expr: term (('+'|'-') term)*
   2548        term: factor (('*'|'@'|'/'|'%'|'//') factor)*
   2549        factor: ('+'|'-'|'~') factor | power
   2550        power: atom_expr ['**' factor]
   2551        atom_expr: ['await'] atom trailer*
   2552        yield_expr: 'yield' [yield_arg]
   2553     */
   2554 
   2555     asdl_seq *seq;
   2556     int i;
   2557 
   2558  loop:
   2559     switch (TYPE(n)) {
   2560         case test:
   2561         case test_nocond:
   2562             if (TYPE(CHILD(n, 0)) == lambdef ||
   2563                 TYPE(CHILD(n, 0)) == lambdef_nocond)
   2564                 return ast_for_lambdef(c, CHILD(n, 0));
   2565             else if (NCH(n) > 1)
   2566                 return ast_for_ifexpr(c, n);
   2567             /* Fallthrough */
   2568         case or_test:
   2569         case and_test:
   2570             if (NCH(n) == 1) {
   2571                 n = CHILD(n, 0);
   2572                 goto loop;
   2573             }
   2574             seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
   2575             if (!seq)
   2576                 return NULL;
   2577             for (i = 0; i < NCH(n); i += 2) {
   2578                 expr_ty e = ast_for_expr(c, CHILD(n, i));
   2579                 if (!e)
   2580                     return NULL;
   2581                 asdl_seq_SET(seq, i / 2, e);
   2582             }
   2583             if (!strcmp(STR(CHILD(n, 1)), "and"))
   2584                 return BoolOp(And, seq, LINENO(n), n->n_col_offset,
   2585                               c->c_arena);
   2586             assert(!strcmp(STR(CHILD(n, 1)), "or"));
   2587             return BoolOp(Or, seq, LINENO(n), n->n_col_offset, c->c_arena);
   2588         case not_test:
   2589             if (NCH(n) == 1) {
   2590                 n = CHILD(n, 0);
   2591                 goto loop;
   2592             }
   2593             else {
   2594                 expr_ty expression = ast_for_expr(c, CHILD(n, 1));
   2595                 if (!expression)
   2596                     return NULL;
   2597 
   2598                 return UnaryOp(Not, expression, LINENO(n), n->n_col_offset,
   2599                                c->c_arena);
   2600             }
   2601         case comparison:
   2602             if (NCH(n) == 1) {
   2603                 n = CHILD(n, 0);
   2604                 goto loop;
   2605             }
   2606             else {
   2607                 expr_ty expression;
   2608                 asdl_int_seq *ops;
   2609                 asdl_seq *cmps;
   2610                 ops = _Py_asdl_int_seq_new(NCH(n) / 2, c->c_arena);
   2611                 if (!ops)
   2612                     return NULL;
   2613                 cmps = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
   2614                 if (!cmps) {
   2615                     return NULL;
   2616                 }
   2617                 for (i = 1; i < NCH(n); i += 2) {
   2618                     cmpop_ty newoperator;
   2619 
   2620                     newoperator = ast_for_comp_op(c, CHILD(n, i));
   2621                     if (!newoperator) {
   2622                         return NULL;
   2623                     }
   2624 
   2625                     expression = ast_for_expr(c, CHILD(n, i + 1));
   2626                     if (!expression) {
   2627                         return NULL;
   2628                     }
   2629 
   2630                     asdl_seq_SET(ops, i / 2, newoperator);
   2631                     asdl_seq_SET(cmps, i / 2, expression);
   2632                 }
   2633                 expression = ast_for_expr(c, CHILD(n, 0));
   2634                 if (!expression) {
   2635                     return NULL;
   2636                 }
   2637 
   2638                 return Compare(expression, ops, cmps, LINENO(n),
   2639                                n->n_col_offset, c->c_arena);
   2640             }
   2641             break;
   2642 
   2643         case star_expr:
   2644             return ast_for_starred(c, n);
   2645         /* The next five cases all handle BinOps.  The main body of code
   2646            is the same in each case, but the switch turned inside out to
   2647            reuse the code for each type of operator.
   2648          */
   2649         case expr:
   2650         case xor_expr:
   2651         case and_expr:
   2652         case shift_expr:
   2653         case arith_expr:
   2654         case term:
   2655             if (NCH(n) == 1) {
   2656                 n = CHILD(n, 0);
   2657                 goto loop;
   2658             }
   2659             return ast_for_binop(c, n);
   2660         case yield_expr: {
   2661             node *an = NULL;
   2662             node *en = NULL;
   2663             int is_from = 0;
   2664             expr_ty exp = NULL;
   2665             if (NCH(n) > 1)
   2666                 an = CHILD(n, 1); /* yield_arg */
   2667             if (an) {
   2668                 en = CHILD(an, NCH(an) - 1);
   2669                 if (NCH(an) == 2) {
   2670                     is_from = 1;
   2671                     exp = ast_for_expr(c, en);
   2672                 }
   2673                 else
   2674                     exp = ast_for_testlist(c, en);
   2675                 if (!exp)
   2676                     return NULL;
   2677             }
   2678             if (is_from)
   2679                 return YieldFrom(exp, LINENO(n), n->n_col_offset, c->c_arena);
   2680             return Yield(exp, LINENO(n), n->n_col_offset, c->c_arena);
   2681         }
   2682         case factor:
   2683             if (NCH(n) == 1) {
   2684                 n = CHILD(n, 0);
   2685                 goto loop;
   2686             }
   2687             return ast_for_factor(c, n);
   2688         case power:
   2689             return ast_for_power(c, n);
   2690         default:
   2691             PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n));
   2692             return NULL;
   2693     }
   2694     /* should never get here unless if error is set */
   2695     return NULL;
   2696 }
   2697 
   2698 static expr_ty
   2699 ast_for_call(struct compiling *c, const node *n, expr_ty func, bool allowgen)
   2700 {
   2701     /*
   2702       arglist: argument (',' argument)*  [',']
   2703       argument: ( test [comp_for] | '*' test | test '=' test | '**' test )
   2704     */
   2705 
   2706     int i, nargs, nkeywords;
   2707     int ndoublestars;
   2708     asdl_seq *args;
   2709     asdl_seq *keywords;
   2710 
   2711     REQ(n, arglist);
   2712 
   2713     nargs = 0;
   2714     nkeywords = 0;
   2715     for (i = 0; i < NCH(n); i++) {
   2716         node *ch = CHILD(n, i);
   2717         if (TYPE(ch) == argument) {
   2718             if (NCH(ch) == 1)
   2719                 nargs++;
   2720             else if (TYPE(CHILD(ch, 1)) == comp_for) {
   2721                 nargs++;
   2722                 if (!allowgen) {
   2723                     ast_error(c, ch, "invalid syntax");
   2724                     return NULL;
   2725                 }
   2726                 if (NCH(n) > 1) {
   2727                     ast_error(c, ch, "Generator expression must be parenthesized");
   2728                     return NULL;
   2729                 }
   2730             }
   2731             else if (TYPE(CHILD(ch, 0)) == STAR)
   2732                 nargs++;
   2733             else
   2734                 /* TYPE(CHILD(ch, 0)) == DOUBLESTAR or keyword argument */
   2735                 nkeywords++;
   2736         }
   2737     }
   2738 
   2739     args = _Py_asdl_seq_new(nargs, c->c_arena);
   2740     if (!args)
   2741         return NULL;
   2742     keywords = _Py_asdl_seq_new(nkeywords, c->c_arena);
   2743     if (!keywords)
   2744         return NULL;
   2745 
   2746     nargs = 0;  /* positional arguments + iterable argument unpackings */
   2747     nkeywords = 0;  /* keyword arguments + keyword argument unpackings */
   2748     ndoublestars = 0;  /* just keyword argument unpackings */
   2749     for (i = 0; i < NCH(n); i++) {
   2750         node *ch = CHILD(n, i);
   2751         if (TYPE(ch) == argument) {
   2752             expr_ty e;
   2753             node *chch = CHILD(ch, 0);
   2754             if (NCH(ch) == 1) {
   2755                 /* a positional argument */
   2756                 if (nkeywords) {
   2757                     if (ndoublestars) {
   2758                         ast_error(c, chch,
   2759                                 "positional argument follows "
   2760                                 "keyword argument unpacking");
   2761                     }
   2762                     else {
   2763                         ast_error(c, chch,
   2764                                 "positional argument follows "
   2765                                 "keyword argument");
   2766                     }
   2767                     return NULL;
   2768                 }
   2769                 e = ast_for_expr(c, chch);
   2770                 if (!e)
   2771                     return NULL;
   2772                 asdl_seq_SET(args, nargs++, e);
   2773             }
   2774             else if (TYPE(chch) == STAR) {
   2775                 /* an iterable argument unpacking */
   2776                 expr_ty starred;
   2777                 if (ndoublestars) {
   2778                     ast_error(c, chch,
   2779                             "iterable argument unpacking follows "
   2780                             "keyword argument unpacking");
   2781                     return NULL;
   2782                 }
   2783                 e = ast_for_expr(c, CHILD(ch, 1));
   2784                 if (!e)
   2785                     return NULL;
   2786                 starred = Starred(e, Load, LINENO(chch),
   2787                         chch->n_col_offset,
   2788                         c->c_arena);
   2789                 if (!starred)
   2790                     return NULL;
   2791                 asdl_seq_SET(args, nargs++, starred);
   2792 
   2793             }
   2794             else if (TYPE(chch) == DOUBLESTAR) {
   2795                 /* a keyword argument unpacking */
   2796                 keyword_ty kw;
   2797                 i++;
   2798                 e = ast_for_expr(c, CHILD(ch, 1));
   2799                 if (!e)
   2800                     return NULL;
   2801                 kw = keyword(NULL, e, c->c_arena);
   2802                 asdl_seq_SET(keywords, nkeywords++, kw);
   2803                 ndoublestars++;
   2804             }
   2805             else if (TYPE(CHILD(ch, 1)) == comp_for) {
   2806                 /* the lone generator expression */
   2807                 e = ast_for_genexp(c, ch);
   2808                 if (!e)
   2809                     return NULL;
   2810                 asdl_seq_SET(args, nargs++, e);
   2811             }
   2812             else {
   2813                 /* a keyword argument */
   2814                 keyword_ty kw;
   2815                 identifier key, tmp;
   2816                 int k;
   2817 
   2818                 /* chch is test, but must be an identifier? */
   2819                 e = ast_for_expr(c, chch);
   2820                 if (!e)
   2821                     return NULL;
   2822                 /* f(lambda x: x[0] = 3) ends up getting parsed with
   2823                  * LHS test = lambda x: x[0], and RHS test = 3.
   2824                  * SF bug 132313 points out that complaining about a keyword
   2825                  * then is very confusing.
   2826                  */
   2827                 if (e->kind == Lambda_kind) {
   2828                     ast_error(c, chch,
   2829                             "lambda cannot contain assignment");
   2830                     return NULL;
   2831                 }
   2832                 else if (e->kind != Name_kind) {
   2833                     ast_error(c, chch,
   2834                             "keyword can't be an expression");
   2835                     return NULL;
   2836                 }
   2837                 else if (forbidden_name(c, e->v.Name.id, ch, 1)) {
   2838                     return NULL;
   2839                 }
   2840                 key = e->v.Name.id;
   2841                 for (k = 0; k < nkeywords; k++) {
   2842                     tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg;
   2843                     if (tmp && !PyUnicode_Compare(tmp, key)) {
   2844                         ast_error(c, chch,
   2845                                 "keyword argument repeated");
   2846                         return NULL;
   2847                     }
   2848                 }
   2849                 e = ast_for_expr(c, CHILD(ch, 2));
   2850                 if (!e)
   2851                     return NULL;
   2852                 kw = keyword(key, e, c->c_arena);
   2853                 if (!kw)
   2854                     return NULL;
   2855                 asdl_seq_SET(keywords, nkeywords++, kw);
   2856             }
   2857         }
   2858     }
   2859 
   2860     return Call(func, args, keywords, func->lineno, func->col_offset, c->c_arena);
   2861 }
   2862 
   2863 static expr_ty
   2864 ast_for_testlist(struct compiling *c, const node* n)
   2865 {
   2866     /* testlist_comp: test (comp_for | (',' test)* [',']) */
   2867     /* testlist: test (',' test)* [','] */
   2868     assert(NCH(n) > 0);
   2869     if (TYPE(n) == testlist_comp) {
   2870         if (NCH(n) > 1)
   2871             assert(TYPE(CHILD(n, 1)) != comp_for);
   2872     }
   2873     else {
   2874         assert(TYPE(n) == testlist ||
   2875                TYPE(n) == testlist_star_expr);
   2876     }
   2877     if (NCH(n) == 1)
   2878         return ast_for_expr(c, CHILD(n, 0));
   2879     else {
   2880         asdl_seq *tmp = seq_for_testlist(c, n);
   2881         if (!tmp)
   2882             return NULL;
   2883         return Tuple(tmp, Load, LINENO(n), n->n_col_offset, c->c_arena);
   2884     }
   2885 }
   2886 
   2887 static stmt_ty
   2888 ast_for_expr_stmt(struct compiling *c, const node *n)
   2889 {
   2890     REQ(n, expr_stmt);
   2891     /* expr_stmt: testlist_star_expr (annassign | augassign (yield_expr|testlist) |
   2892                             ('=' (yield_expr|testlist_star_expr))*)
   2893        annassign: ':' test ['=' test]
   2894        testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
   2895        augassign: '+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^='
   2896                 | '<<=' | '>>=' | '**=' | '//='
   2897        test: ... here starts the operator precedence dance
   2898      */
   2899 
   2900     if (NCH(n) == 1) {
   2901         expr_ty e = ast_for_testlist(c, CHILD(n, 0));
   2902         if (!e)
   2903             return NULL;
   2904 
   2905         return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
   2906     }
   2907     else if (TYPE(CHILD(n, 1)) == augassign) {
   2908         expr_ty expr1, expr2;
   2909         operator_ty newoperator;
   2910         node *ch = CHILD(n, 0);
   2911 
   2912         expr1 = ast_for_testlist(c, ch);
   2913         if (!expr1)
   2914             return NULL;
   2915         if(!set_context(c, expr1, Store, ch))
   2916             return NULL;
   2917         /* set_context checks that most expressions are not the left side.
   2918           Augmented assignments can only have a name, a subscript, or an
   2919           attribute on the left, though, so we have to explicitly check for
   2920           those. */
   2921         switch (expr1->kind) {
   2922             case Name_kind:
   2923             case Attribute_kind:
   2924             case Subscript_kind:
   2925                 break;
   2926             default:
   2927                 ast_error(c, ch, "illegal expression for augmented assignment");
   2928                 return NULL;
   2929         }
   2930 
   2931         ch = CHILD(n, 2);
   2932         if (TYPE(ch) == testlist)
   2933             expr2 = ast_for_testlist(c, ch);
   2934         else
   2935             expr2 = ast_for_expr(c, ch);
   2936         if (!expr2)
   2937             return NULL;
   2938 
   2939         newoperator = ast_for_augassign(c, CHILD(n, 1));
   2940         if (!newoperator)
   2941             return NULL;
   2942 
   2943         return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
   2944     }
   2945     else if (TYPE(CHILD(n, 1)) == annassign) {
   2946         expr_ty expr1, expr2, expr3;
   2947         node *ch = CHILD(n, 0);
   2948         node *deep, *ann = CHILD(n, 1);
   2949         int simple = 1;
   2950 
   2951         /* we keep track of parens to qualify (x) as expression not name */
   2952         deep = ch;
   2953         while (NCH(deep) == 1) {
   2954             deep = CHILD(deep, 0);
   2955         }
   2956         if (NCH(deep) > 0 && TYPE(CHILD(deep, 0)) == LPAR) {
   2957             simple = 0;
   2958         }
   2959         expr1 = ast_for_testlist(c, ch);
   2960         if (!expr1) {
   2961             return NULL;
   2962         }
   2963         switch (expr1->kind) {
   2964             case Name_kind:
   2965                 if (forbidden_name(c, expr1->v.Name.id, n, 0)) {
   2966                     return NULL;
   2967                 }
   2968                 expr1->v.Name.ctx = Store;
   2969                 break;
   2970             case Attribute_kind:
   2971                 if (forbidden_name(c, expr1->v.Attribute.attr, n, 1)) {
   2972                     return NULL;
   2973                 }
   2974                 expr1->v.Attribute.ctx = Store;
   2975                 break;
   2976             case Subscript_kind:
   2977                 expr1->v.Subscript.ctx = Store;
   2978                 break;
   2979             case List_kind:
   2980                 ast_error(c, ch,
   2981                           "only single target (not list) can be annotated");
   2982                 return NULL;
   2983             case Tuple_kind:
   2984                 ast_error(c, ch,
   2985                           "only single target (not tuple) can be annotated");
   2986                 return NULL;
   2987             default:
   2988                 ast_error(c, ch,
   2989                           "illegal target for annotation");
   2990                 return NULL;
   2991         }
   2992 
   2993         if (expr1->kind != Name_kind) {
   2994             simple = 0;
   2995         }
   2996         ch = CHILD(ann, 1);
   2997         expr2 = ast_for_expr(c, ch);
   2998         if (!expr2) {
   2999             return NULL;
   3000         }
   3001         if (NCH(ann) == 2) {
   3002             return AnnAssign(expr1, expr2, NULL, simple,
   3003                              LINENO(n), n->n_col_offset, c->c_arena);
   3004         }
   3005         else {
   3006             ch = CHILD(ann, 3);
   3007             expr3 = ast_for_expr(c, ch);
   3008             if (!expr3) {
   3009                 return NULL;
   3010             }
   3011             return AnnAssign(expr1, expr2, expr3, simple,
   3012                              LINENO(n), n->n_col_offset, c->c_arena);
   3013         }
   3014     }
   3015     else {
   3016         int i;
   3017         asdl_seq *targets;
   3018         node *value;
   3019         expr_ty expression;
   3020 
   3021         /* a normal assignment */
   3022         REQ(CHILD(n, 1), EQUAL);
   3023         targets = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
   3024         if (!targets)
   3025             return NULL;
   3026         for (i = 0; i < NCH(n) - 2; i += 2) {
   3027             expr_ty e;
   3028             node *ch = CHILD(n, i);
   3029             if (TYPE(ch) == yield_expr) {
   3030                 ast_error(c, ch, "assignment to yield expression not possible");
   3031                 return NULL;
   3032             }
   3033             e = ast_for_testlist(c, ch);
   3034             if (!e)
   3035               return NULL;
   3036 
   3037             /* set context to assign */
   3038             if (!set_context(c, e, Store, CHILD(n, i)))
   3039               return NULL;
   3040 
   3041             asdl_seq_SET(targets, i / 2, e);
   3042         }
   3043         value = CHILD(n, NCH(n) - 1);
   3044         if (TYPE(value) == testlist_star_expr)
   3045             expression = ast_for_testlist(c, value);
   3046         else
   3047             expression = ast_for_expr(c, value);
   3048         if (!expression)
   3049             return NULL;
   3050         return Assign(targets, expression, LINENO(n), n->n_col_offset, c->c_arena);
   3051     }
   3052 }
   3053 
   3054 
   3055 static asdl_seq *
   3056 ast_for_exprlist(struct compiling *c, const node *n, expr_context_ty context)
   3057 {
   3058     asdl_seq *seq;
   3059     int i;
   3060     expr_ty e;
   3061 
   3062     REQ(n, exprlist);
   3063 
   3064     seq = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
   3065     if (!seq)
   3066         return NULL;
   3067     for (i = 0; i < NCH(n); i += 2) {
   3068         e = ast_for_expr(c, CHILD(n, i));
   3069         if (!e)
   3070             return NULL;
   3071         asdl_seq_SET(seq, i / 2, e);
   3072         if (context && !set_context(c, e, context, CHILD(n, i)))
   3073             return NULL;
   3074     }
   3075     return seq;
   3076 }
   3077 
   3078 static stmt_ty
   3079 ast_for_del_stmt(struct compiling *c, const node *n)
   3080 {
   3081     asdl_seq *expr_list;
   3082 
   3083     /* del_stmt: 'del' exprlist */
   3084     REQ(n, del_stmt);
   3085 
   3086     expr_list = ast_for_exprlist(c, CHILD(n, 1), Del);
   3087     if (!expr_list)
   3088         return NULL;
   3089     return Delete(expr_list, LINENO(n), n->n_col_offset, c->c_arena);
   3090 }
   3091 
   3092 static stmt_ty
   3093 ast_for_flow_stmt(struct compiling *c, const node *n)
   3094 {
   3095     /*
   3096       flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt
   3097                  | yield_stmt
   3098       break_stmt: 'break'
   3099       continue_stmt: 'continue'
   3100       return_stmt: 'return' [testlist]
   3101       yield_stmt: yield_expr
   3102       yield_expr: 'yield' testlist | 'yield' 'from' test
   3103       raise_stmt: 'raise' [test [',' test [',' test]]]
   3104     */
   3105     node *ch;
   3106 
   3107     REQ(n, flow_stmt);
   3108     ch = CHILD(n, 0);
   3109     switch (TYPE(ch)) {
   3110         case break_stmt:
   3111             return Break(LINENO(n), n->n_col_offset, c->c_arena);
   3112         case continue_stmt:
   3113             return Continue(LINENO(n), n->n_col_offset, c->c_arena);
   3114         case yield_stmt: { /* will reduce to yield_expr */
   3115             expr_ty exp = ast_for_expr(c, CHILD(ch, 0));
   3116             if (!exp)
   3117                 return NULL;
   3118             return Expr(exp, LINENO(n), n->n_col_offset, c->c_arena);
   3119         }
   3120         case return_stmt:
   3121             if (NCH(ch) == 1)
   3122                 return Return(NULL, LINENO(n), n->n_col_offset, c->c_arena);
   3123             else {
   3124                 expr_ty expression = ast_for_testlist(c, CHILD(ch, 1));
   3125                 if (!expression)
   3126                     return NULL;
   3127                 return Return(expression, LINENO(n), n->n_col_offset, c->c_arena);
   3128             }
   3129         case raise_stmt:
   3130             if (NCH(ch) == 1)
   3131                 return Raise(NULL, NULL, LINENO(n), n->n_col_offset, c->c_arena);
   3132             else if (NCH(ch) >= 2) {
   3133                 expr_ty cause = NULL;
   3134                 expr_ty expression = ast_for_expr(c, CHILD(ch, 1));
   3135                 if (!expression)
   3136                     return NULL;
   3137                 if (NCH(ch) == 4) {
   3138                     cause = ast_for_expr(c, CHILD(ch, 3));
   3139                     if (!cause)
   3140                         return NULL;
   3141                 }
   3142                 return Raise(expression, cause, LINENO(n), n->n_col_offset, c->c_arena);
   3143             }
   3144             /* fall through */
   3145         default:
   3146             PyErr_Format(PyExc_SystemError,
   3147                          "unexpected flow_stmt: %d", TYPE(ch));
   3148             return NULL;
   3149     }
   3150 }
   3151 
   3152 static alias_ty
   3153 alias_for_import_name(struct compiling *c, const node *n, int store)
   3154 {
   3155     /*
   3156       import_as_name: NAME ['as' NAME]
   3157       dotted_as_name: dotted_name ['as' NAME]
   3158       dotted_name: NAME ('.' NAME)*
   3159     */
   3160     identifier str, name;
   3161 
   3162  loop:
   3163     switch (TYPE(n)) {
   3164         case import_as_name: {
   3165             node *name_node = CHILD(n, 0);
   3166             str = NULL;
   3167             name = NEW_IDENTIFIER(name_node);
   3168             if (!name)
   3169                 return NULL;
   3170             if (NCH(n) == 3) {
   3171                 node *str_node = CHILD(n, 2);
   3172                 str = NEW_IDENTIFIER(str_node);
   3173                 if (!str)
   3174                     return NULL;
   3175                 if (store && forbidden_name(c, str, str_node, 0))
   3176                     return NULL;
   3177             }
   3178             else {
   3179                 if (forbidden_name(c, name, name_node, 0))
   3180                     return NULL;
   3181             }
   3182             return alias(name, str, c->c_arena);
   3183         }
   3184         case dotted_as_name:
   3185             if (NCH(n) == 1) {
   3186                 n = CHILD(n, 0);
   3187                 goto loop;
   3188             }
   3189             else {
   3190                 node *asname_node = CHILD(n, 2);
   3191                 alias_ty a = alias_for_import_name(c, CHILD(n, 0), 0);
   3192                 if (!a)
   3193                     return NULL;
   3194                 assert(!a->asname);
   3195                 a->asname = NEW_IDENTIFIER(asname_node);
   3196                 if (!a->asname)
   3197                     return NULL;
   3198                 if (forbidden_name(c, a->asname, asname_node, 0))
   3199                     return NULL;
   3200                 return a;
   3201             }
   3202             break;
   3203         case dotted_name:
   3204             if (NCH(n) == 1) {
   3205                 node *name_node = CHILD(n, 0);
   3206                 name = NEW_IDENTIFIER(name_node);
   3207                 if (!name)
   3208                     return NULL;
   3209                 if (store && forbidden_name(c, name, name_node, 0))
   3210                     return NULL;
   3211                 return alias(name, NULL, c->c_arena);
   3212             }
   3213             else {
   3214                 /* Create a string of the form "a.b.c" */
   3215                 int i;
   3216                 size_t len;
   3217                 char *s;
   3218                 PyObject *uni;
   3219 
   3220                 len = 0;
   3221                 for (i = 0; i < NCH(n); i += 2)
   3222                     /* length of string plus one for the dot */
   3223                     len += strlen(STR(CHILD(n, i))) + 1;
   3224                 len--; /* the last name doesn't have a dot */
   3225                 str = PyBytes_FromStringAndSize(NULL, len);
   3226                 if (!str)
   3227                     return NULL;
   3228                 s = PyBytes_AS_STRING(str);
   3229                 if (!s)
   3230                     return NULL;
   3231                 for (i = 0; i < NCH(n); i += 2) {
   3232                     char *sch = STR(CHILD(n, i));
   3233                     strcpy(s, STR(CHILD(n, i)));
   3234                     s += strlen(sch);
   3235                     *s++ = '.';
   3236                 }
   3237                 --s;
   3238                 *s = '\0';
   3239                 uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str),
   3240                                            PyBytes_GET_SIZE(str),
   3241                                            NULL);
   3242                 Py_DECREF(str);
   3243                 if (!uni)
   3244                     return NULL;
   3245                 str = uni;
   3246                 PyUnicode_InternInPlace(&str);
   3247                 if (PyArena_AddPyObject(c->c_arena, str) < 0) {
   3248                     Py_DECREF(str);
   3249                     return NULL;
   3250                 }
   3251                 return alias(str, NULL, c->c_arena);
   3252             }
   3253             break;
   3254         case STAR:
   3255             str = PyUnicode_InternFromString("*");
   3256             if (!str)
   3257                 return NULL;
   3258             if (PyArena_AddPyObject(c->c_arena, str) < 0) {
   3259                 Py_DECREF(str);
   3260                 return NULL;
   3261             }
   3262             return alias(str, NULL, c->c_arena);
   3263         default:
   3264             PyErr_Format(PyExc_SystemError,
   3265                          "unexpected import name: %d", TYPE(n));
   3266             return NULL;
   3267     }
   3268 
   3269     PyErr_SetString(PyExc_SystemError, "unhandled import name condition");
   3270     return NULL;
   3271 }
   3272 
   3273 static stmt_ty
   3274 ast_for_import_stmt(struct compiling *c, const node *n)
   3275 {
   3276     /*
   3277       import_stmt: import_name | import_from
   3278       import_name: 'import' dotted_as_names
   3279       import_from: 'from' (('.' | '...')* dotted_name | ('.' | '...')+)
   3280                    'import' ('*' | '(' import_as_names ')' | import_as_names)
   3281     */
   3282     int lineno;
   3283     int col_offset;
   3284     int i;
   3285     asdl_seq *aliases;
   3286 
   3287     REQ(n, import_stmt);
   3288     lineno = LINENO(n);
   3289     col_offset = n->n_col_offset;
   3290     n = CHILD(n, 0);
   3291     if (TYPE(n) == import_name) {
   3292         n = CHILD(n, 1);
   3293         REQ(n, dotted_as_names);
   3294         aliases = _Py_asdl_seq_new((NCH(n) + 1) / 2, c->c_arena);
   3295         if (!aliases)
   3296                 return NULL;
   3297         for (i = 0; i < NCH(n); i += 2) {
   3298             alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
   3299             if (!import_alias)
   3300                 return NULL;
   3301             asdl_seq_SET(aliases, i / 2, import_alias);
   3302         }
   3303         return Import(aliases, lineno, col_offset, c->c_arena);
   3304     }
   3305     else if (TYPE(n) == import_from) {
   3306         int n_children;
   3307         int idx, ndots = 0;
   3308         alias_ty mod = NULL;
   3309         identifier modname = NULL;
   3310 
   3311        /* Count the number of dots (for relative imports) and check for the
   3312           optional module name */
   3313         for (idx = 1; idx < NCH(n); idx++) {
   3314             if (TYPE(CHILD(n, idx)) == dotted_name) {
   3315                 mod = alias_for_import_name(c, CHILD(n, idx), 0);
   3316                 if (!mod)
   3317                     return NULL;
   3318                 idx++;
   3319                 break;
   3320             } else if (TYPE(CHILD(n, idx)) == ELLIPSIS) {
   3321                 /* three consecutive dots are tokenized as one ELLIPSIS */
   3322                 ndots += 3;
   3323                 continue;
   3324             } else if (TYPE(CHILD(n, idx)) != DOT) {
   3325                 break;
   3326             }
   3327             ndots++;
   3328         }
   3329         idx++; /* skip over the 'import' keyword */
   3330         switch (TYPE(CHILD(n, idx))) {
   3331         case STAR:
   3332             /* from ... import * */
   3333             n = CHILD(n, idx);
   3334             n_children = 1;
   3335             break;
   3336         case LPAR:
   3337             /* from ... import (x, y, z) */
   3338             n = CHILD(n, idx + 1);
   3339             n_children = NCH(n);
   3340             break;
   3341         case import_as_names:
   3342             /* from ... import x, y, z */
   3343             n = CHILD(n, idx);
   3344             n_children = NCH(n);
   3345             if (n_children % 2 == 0) {
   3346                 ast_error(c, n, "trailing comma not allowed without"
   3347                              " surrounding parentheses");
   3348                 return NULL;
   3349             }
   3350             break;
   3351         default:
   3352             ast_error(c, n, "Unexpected node-type in from-import");
   3353             return NULL;
   3354         }
   3355 
   3356         aliases = _Py_asdl_seq_new((n_children + 1) / 2, c->c_arena);
   3357         if (!aliases)
   3358             return NULL;
   3359 
   3360         /* handle "from ... import *" special b/c there's no children */
   3361         if (TYPE(n) == STAR) {
   3362             alias_ty import_alias = alias_for_import_name(c, n, 1);
   3363             if (!import_alias)
   3364                 return NULL;
   3365             asdl_seq_SET(aliases, 0, import_alias);
   3366         }
   3367         else {
   3368             for (i = 0; i < NCH(n); i += 2) {
   3369                 alias_ty import_alias = alias_for_import_name(c, CHILD(n, i), 1);
   3370                 if (!import_alias)
   3371                     return NULL;
   3372                 asdl_seq_SET(aliases, i / 2, import_alias);
   3373             }
   3374         }
   3375         if (mod != NULL)
   3376             modname = mod->name;
   3377         return ImportFrom(modname, aliases, ndots, lineno, col_offset,
   3378                           c->c_arena);
   3379     }
   3380     PyErr_Format(PyExc_SystemError,
   3381                  "unknown import statement: starts with command '%s'",
   3382                  STR(CHILD(n, 0)));
   3383     return NULL;
   3384 }
   3385 
   3386 static stmt_ty
   3387 ast_for_global_stmt(struct compiling *c, const node *n)
   3388 {
   3389     /* global_stmt: 'global' NAME (',' NAME)* */
   3390     identifier name;
   3391     asdl_seq *s;
   3392     int i;
   3393 
   3394     REQ(n, global_stmt);
   3395     s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
   3396     if (!s)
   3397         return NULL;
   3398     for (i = 1; i < NCH(n); i += 2) {
   3399         name = NEW_IDENTIFIER(CHILD(n, i));
   3400         if (!name)
   3401             return NULL;
   3402         asdl_seq_SET(s, i / 2, name);
   3403     }
   3404     return Global(s, LINENO(n), n->n_col_offset, c->c_arena);
   3405 }
   3406 
   3407 static stmt_ty
   3408 ast_for_nonlocal_stmt(struct compiling *c, const node *n)
   3409 {
   3410     /* nonlocal_stmt: 'nonlocal' NAME (',' NAME)* */
   3411     identifier name;
   3412     asdl_seq *s;
   3413     int i;
   3414 
   3415     REQ(n, nonlocal_stmt);
   3416     s = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena);
   3417     if (!s)
   3418         return NULL;
   3419     for (i = 1; i < NCH(n); i += 2) {
   3420         name = NEW_IDENTIFIER(CHILD(n, i));
   3421         if (!name)
   3422             return NULL;
   3423         asdl_seq_SET(s, i / 2, name);
   3424     }
   3425     return Nonlocal(s, LINENO(n), n->n_col_offset, c->c_arena);
   3426 }
   3427 
   3428 static stmt_ty
   3429 ast_for_assert_stmt(struct compiling *c, const node *n)
   3430 {
   3431     /* assert_stmt: 'assert' test [',' test] */
   3432     REQ(n, assert_stmt);
   3433     if (NCH(n) == 2) {
   3434         expr_ty expression = ast_for_expr(c, CHILD(n, 1));
   3435         if (!expression)
   3436             return NULL;
   3437         return Assert(expression, NULL, LINENO(n), n->n_col_offset, c->c_arena);
   3438     }
   3439     else if (NCH(n) == 4) {
   3440         expr_ty expr1, expr2;
   3441 
   3442         expr1 = ast_for_expr(c, CHILD(n, 1));
   3443         if (!expr1)
   3444             return NULL;
   3445         expr2 = ast_for_expr(c, CHILD(n, 3));
   3446         if (!expr2)
   3447             return NULL;
   3448 
   3449         return Assert(expr1, expr2, LINENO(n), n->n_col_offset, c->c_arena);
   3450     }
   3451     PyErr_Format(PyExc_SystemError,
   3452                  "improper number of parts to 'assert' statement: %d",
   3453                  NCH(n));
   3454     return NULL;
   3455 }
   3456 
   3457 static asdl_seq *
   3458 ast_for_suite(struct compiling *c, const node *n)
   3459 {
   3460     /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */
   3461     asdl_seq *seq;
   3462     stmt_ty s;
   3463     int i, total, num, end, pos = 0;
   3464     node *ch;
   3465 
   3466     REQ(n, suite);
   3467 
   3468     total = num_stmts(n);
   3469     seq = _Py_asdl_seq_new(total, c->c_arena);
   3470     if (!seq)
   3471         return NULL;
   3472     if (TYPE(CHILD(n, 0)) == simple_stmt) {
   3473         n = CHILD(n, 0);
   3474         /* simple_stmt always ends with a NEWLINE,
   3475            and may have a trailing SEMI
   3476         */
   3477         end = NCH(n) - 1;
   3478         if (TYPE(CHILD(n, end - 1)) == SEMI)
   3479             end--;
   3480         /* loop by 2 to skip semi-colons */
   3481         for (i = 0; i < end; i += 2) {
   3482             ch = CHILD(n, i);
   3483             s = ast_for_stmt(c, ch);
   3484             if (!s)
   3485                 return NULL;
   3486             asdl_seq_SET(seq, pos++, s);
   3487         }
   3488     }
   3489     else {
   3490         for (i = 2; i < (NCH(n) - 1); i++) {
   3491             ch = CHILD(n, i);
   3492             REQ(ch, stmt);
   3493             num = num_stmts(ch);
   3494             if (num == 1) {
   3495                 /* small_stmt or compound_stmt with only one child */
   3496                 s = ast_for_stmt(c, ch);
   3497                 if (!s)
   3498                     return NULL;
   3499                 asdl_seq_SET(seq, pos++, s);
   3500             }
   3501             else {
   3502                 int j;
   3503                 ch = CHILD(ch, 0);
   3504                 REQ(ch, simple_stmt);
   3505                 for (j = 0; j < NCH(ch); j += 2) {
   3506                     /* statement terminates with a semi-colon ';' */
   3507                     if (NCH(CHILD(ch, j)) == 0) {
   3508                         assert((j + 1) == NCH(ch));
   3509                         break;
   3510                     }
   3511                     s = ast_for_stmt(c, CHILD(ch, j));
   3512                     if (!s)
   3513                         return NULL;
   3514                     asdl_seq_SET(seq, pos++, s);
   3515                 }
   3516             }
   3517         }
   3518     }
   3519     assert(pos == seq->size);
   3520     return seq;
   3521 }
   3522 
   3523 static stmt_ty
   3524 ast_for_if_stmt(struct compiling *c, const node *n)
   3525 {
   3526     /* if_stmt: 'if' test ':' suite ('elif' test ':' suite)*
   3527        ['else' ':' suite]
   3528     */
   3529     char *s;
   3530 
   3531     REQ(n, if_stmt);
   3532 
   3533     if (NCH(n) == 4) {
   3534         expr_ty expression;
   3535         asdl_seq *suite_seq;
   3536 
   3537         expression = ast_for_expr(c, CHILD(n, 1));
   3538         if (!expression)
   3539             return NULL;
   3540         suite_seq = ast_for_suite(c, CHILD(n, 3));
   3541         if (!suite_seq)
   3542             return NULL;
   3543 
   3544         return If(expression, suite_seq, NULL, LINENO(n), n->n_col_offset,
   3545                   c->c_arena);
   3546     }
   3547 
   3548     s = STR(CHILD(n, 4));
   3549     /* s[2], the third character in the string, will be
   3550        's' for el_s_e, or
   3551        'i' for el_i_f
   3552     */
   3553     if (s[2] == 's') {
   3554         expr_ty expression;
   3555         asdl_seq *seq1, *seq2;
   3556 
   3557         expression = ast_for_expr(c, CHILD(n, 1));
   3558         if (!expression)
   3559             return NULL;
   3560         seq1 = ast_for_suite(c, CHILD(n, 3));
   3561         if (!seq1)
   3562             return NULL;
   3563         seq2 = ast_for_suite(c, CHILD(n, 6));
   3564         if (!seq2)
   3565             return NULL;
   3566 
   3567         return If(expression, seq1, seq2, LINENO(n), n->n_col_offset,
   3568                   c->c_arena);
   3569     }
   3570     else if (s[2] == 'i') {
   3571         int i, n_elif, has_else = 0;
   3572         expr_ty expression;
   3573         asdl_seq *suite_seq;
   3574         asdl_seq *orelse = NULL;
   3575         n_elif = NCH(n) - 4;
   3576         /* must reference the child n_elif+1 since 'else' token is third,
   3577            not fourth, child from the end. */
   3578         if (TYPE(CHILD(n, (n_elif + 1))) == NAME
   3579             && STR(CHILD(n, (n_elif + 1)))[2] == 's') {
   3580             has_else = 1;
   3581             n_elif -= 3;
   3582         }
   3583         n_elif /= 4;
   3584 
   3585         if (has_else) {
   3586             asdl_seq *suite_seq2;
   3587 
   3588             orelse = _Py_asdl_seq_new(1, c->c_arena);
   3589             if (!orelse)
   3590                 return NULL;
   3591             expression = ast_for_expr(c, CHILD(n, NCH(n) - 6));
   3592             if (!expression)
   3593                 return NULL;
   3594             suite_seq = ast_for_suite(c, CHILD(n, NCH(n) - 4));
   3595             if (!suite_seq)
   3596                 return NULL;
   3597             suite_seq2 = ast_for_suite(c, CHILD(n, NCH(n) - 1));
   3598             if (!suite_seq2)
   3599                 return NULL;
   3600 
   3601             asdl_seq_SET(orelse, 0,
   3602                          If(expression, suite_seq, suite_seq2,
   3603                             LINENO(CHILD(n, NCH(n) - 6)),
   3604                             CHILD(n, NCH(n) - 6)->n_col_offset,
   3605                             c->c_arena));
   3606             /* the just-created orelse handled the last elif */
   3607             n_elif--;
   3608         }
   3609 
   3610         for (i = 0; i < n_elif; i++) {
   3611             int off = 5 + (n_elif - i - 1) * 4;
   3612             asdl_seq *newobj = _Py_asdl_seq_new(1, c->c_arena);
   3613             if (!newobj)
   3614                 return NULL;
   3615             expression = ast_for_expr(c, CHILD(n, off));
   3616             if (!expression)
   3617                 return NULL;
   3618             suite_seq = ast_for_suite(c, CHILD(n, off + 2));
   3619             if (!suite_seq)
   3620                 return NULL;
   3621 
   3622             asdl_seq_SET(newobj, 0,
   3623                          If(expression, suite_seq, orelse,
   3624                             LINENO(CHILD(n, off)),
   3625                             CHILD(n, off)->n_col_offset, c->c_arena));
   3626             orelse = newobj;
   3627         }
   3628         expression = ast_for_expr(c, CHILD(n, 1));
   3629         if (!expression)
   3630             return NULL;
   3631         suite_seq = ast_for_suite(c, CHILD(n, 3));
   3632         if (!suite_seq)
   3633             return NULL;
   3634         return If(expression, suite_seq, orelse,
   3635                   LINENO(n), n->n_col_offset, c->c_arena);
   3636     }
   3637 
   3638     PyErr_Format(PyExc_SystemError,
   3639                  "unexpected token in 'if' statement: %s", s);
   3640     return NULL;
   3641 }
   3642 
   3643 static stmt_ty
   3644 ast_for_while_stmt(struct compiling *c, const node *n)
   3645 {
   3646     /* while_stmt: 'while' test ':' suite ['else' ':' suite] */
   3647     REQ(n, while_stmt);
   3648 
   3649     if (NCH(n) == 4) {
   3650         expr_ty expression;
   3651         asdl_seq *suite_seq;
   3652 
   3653         expression = ast_for_expr(c, CHILD(n, 1));
   3654         if (!expression)
   3655             return NULL;
   3656         suite_seq = ast_for_suite(c, CHILD(n, 3));
   3657         if (!suite_seq)
   3658             return NULL;
   3659         return While(expression, suite_seq, NULL, LINENO(n), n->n_col_offset, c->c_arena);
   3660     }
   3661     else if (NCH(n) == 7) {
   3662         expr_ty expression;
   3663         asdl_seq *seq1, *seq2;
   3664 
   3665         expression = ast_for_expr(c, CHILD(n, 1));
   3666         if (!expression)
   3667             return NULL;
   3668         seq1 = ast_for_suite(c, CHILD(n, 3));
   3669         if (!seq1)
   3670             return NULL;
   3671         seq2 = ast_for_suite(c, CHILD(n, 6));
   3672         if (!seq2)
   3673             return NULL;
   3674 
   3675         return While(expression, seq1, seq2, LINENO(n), n->n_col_offset, c->c_arena);
   3676     }
   3677 
   3678     PyErr_Format(PyExc_SystemError,
   3679                  "wrong number of tokens for 'while' statement: %d",
   3680                  NCH(n));
   3681     return NULL;
   3682 }
   3683 
   3684 static stmt_ty
   3685 ast_for_for_stmt(struct compiling *c, const node *n0, bool is_async)
   3686 {
   3687     const node * const n = is_async ? CHILD(n0, 1) : n0;
   3688     asdl_seq *_target, *seq = NULL, *suite_seq;
   3689     expr_ty expression;
   3690     expr_ty target, first;
   3691     const node *node_target;
   3692     /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */
   3693     REQ(n, for_stmt);
   3694 
   3695     if (NCH(n) == 9) {
   3696         seq = ast_for_suite(c, CHILD(n, 8));
   3697         if (!seq)
   3698             return NULL;
   3699     }
   3700 
   3701     node_target = CHILD(n, 1);
   3702     _target = ast_for_exprlist(c, node_target, Store);
   3703     if (!_target)
   3704         return NULL;
   3705     /* Check the # of children rather than the length of _target, since
   3706        for x, in ... has 1 element in _target, but still requires a Tuple. */
   3707     first = (expr_ty)asdl_seq_GET(_target, 0);
   3708     if (NCH(node_target) == 1)
   3709         target = first;
   3710     else
   3711         target = Tuple(_target, Store, first->lineno, first->col_offset, c->c_arena);
   3712 
   3713     expression = ast_for_testlist(c, CHILD(n, 3));
   3714     if (!expression)
   3715         return NULL;
   3716     suite_seq = ast_for_suite(c, CHILD(n, 5));
   3717     if (!suite_seq)
   3718         return NULL;
   3719 
   3720     if (is_async)
   3721         return AsyncFor(target, expression, suite_seq, seq,
   3722                         LINENO(n0), n0->n_col_offset,
   3723                         c->c_arena);
   3724     else
   3725         return For(target, expression, suite_seq, seq,
   3726                    LINENO(n), n->n_col_offset,
   3727                    c->c_arena);
   3728 }
   3729 
   3730 static excepthandler_ty
   3731 ast_for_except_clause(struct compiling *c, const node *exc, node *body)
   3732 {
   3733     /* except_clause: 'except' [test ['as' test]] */
   3734     REQ(exc, except_clause);
   3735     REQ(body, suite);
   3736 
   3737     if (NCH(exc) == 1) {
   3738         asdl_seq *suite_seq = ast_for_suite(c, body);
   3739         if (!suite_seq)
   3740             return NULL;
   3741 
   3742         return ExceptHandler(NULL, NULL, suite_seq, LINENO(exc),
   3743                              exc->n_col_offset, c->c_arena);
   3744     }
   3745     else if (NCH(exc) == 2) {
   3746         expr_ty expression;
   3747         asdl_seq *suite_seq;
   3748 
   3749         expression = ast_for_expr(c, CHILD(exc, 1));
   3750         if (!expression)
   3751             return NULL;
   3752         suite_seq = ast_for_suite(c, body);
   3753         if (!suite_seq)
   3754             return NULL;
   3755 
   3756         return ExceptHandler(expression, NULL, suite_seq, LINENO(exc),
   3757                              exc->n_col_offset, c->c_arena);
   3758     }
   3759     else if (NCH(exc) == 4) {
   3760         asdl_seq *suite_seq;
   3761         expr_ty expression;
   3762         identifier e = NEW_IDENTIFIER(CHILD(exc, 3));
   3763         if (!e)
   3764             return NULL;
   3765         if (forbidden_name(c, e, CHILD(exc, 3), 0))
   3766             return NULL;
   3767         expression = ast_for_expr(c, CHILD(exc, 1));
   3768         if (!expression)
   3769             return NULL;
   3770         suite_seq = ast_for_suite(c, body);
   3771         if (!suite_seq)
   3772             return NULL;
   3773 
   3774         return ExceptHandler(expression, e, suite_seq, LINENO(exc),
   3775                              exc->n_col_offset, c->c_arena);
   3776     }
   3777 
   3778     PyErr_Format(PyExc_SystemError,
   3779                  "wrong number of children for 'except' clause: %d",
   3780                  NCH(exc));
   3781     return NULL;
   3782 }
   3783 
   3784 static stmt_ty
   3785 ast_for_try_stmt(struct compiling *c, const node *n)
   3786 {
   3787     const int nch = NCH(n);
   3788     int n_except = (nch - 3)/3;
   3789     asdl_seq *body, *handlers = NULL, *orelse = NULL, *finally = NULL;
   3790 
   3791     REQ(n, try_stmt);
   3792 
   3793     body = ast_for_suite(c, CHILD(n, 2));
   3794     if (body == NULL)
   3795         return NULL;
   3796 
   3797     if (TYPE(CHILD(n, nch - 3)) == NAME) {
   3798         if (strcmp(STR(CHILD(n, nch - 3)), "finally") == 0) {
   3799             if (nch >= 9 && TYPE(CHILD(n, nch - 6)) == NAME) {
   3800                 /* we can assume it's an "else",
   3801                    because nch >= 9 for try-else-finally and
   3802                    it would otherwise have a type of except_clause */
   3803                 orelse = ast_for_suite(c, CHILD(n, nch - 4));
   3804                 if (orelse == NULL)
   3805                     return NULL;
   3806                 n_except--;
   3807             }
   3808 
   3809             finally = ast_for_suite(c, CHILD(n, nch - 1));
   3810             if (finally == NULL)
   3811                 return NULL;
   3812             n_except--;
   3813         }
   3814         else {
   3815             /* we can assume it's an "else",
   3816                otherwise it would have a type of except_clause */
   3817             orelse = ast_for_suite(c, CHILD(n, nch - 1));
   3818             if (orelse == NULL)
   3819                 return NULL;
   3820             n_except--;
   3821         }
   3822     }
   3823     else if (TYPE(CHILD(n, nch - 3)) != except_clause) {
   3824         ast_error(c, n, "malformed 'try' statement");
   3825         return NULL;
   3826     }
   3827 
   3828     if (n_except > 0) {
   3829         int i;
   3830         /* process except statements to create a try ... except */
   3831         handlers = _Py_asdl_seq_new(n_except, c->c_arena);
   3832         if (handlers == NULL)
   3833             return NULL;
   3834 
   3835         for (i = 0; i < n_except; i++) {
   3836             excepthandler_ty e = ast_for_except_clause(c, CHILD(n, 3 + i * 3),
   3837                                                        CHILD(n, 5 + i * 3));
   3838             if (!e)
   3839                 return NULL;
   3840             asdl_seq_SET(handlers, i, e);
   3841         }
   3842     }
   3843 
   3844     assert(finally != NULL || asdl_seq_LEN(handlers));
   3845     return Try(body, handlers, orelse, finally, LINENO(n), n->n_col_offset, c->c_arena);
   3846 }
   3847 
   3848 /* with_item: test ['as' expr] */
   3849 static withitem_ty
   3850 ast_for_with_item(struct compiling *c, const node *n)
   3851 {
   3852     expr_ty context_expr, optional_vars = NULL;
   3853 
   3854     REQ(n, with_item);
   3855     context_expr = ast_for_expr(c, CHILD(n, 0));
   3856     if (!context_expr)
   3857         return NULL;
   3858     if (NCH(n) == 3) {
   3859         optional_vars = ast_for_expr(c, CHILD(n, 2));
   3860 
   3861         if (!optional_vars) {
   3862             return NULL;
   3863         }
   3864         if (!set_context(c, optional_vars, Store, n)) {
   3865             return NULL;
   3866         }
   3867     }
   3868 
   3869     return withitem(context_expr, optional_vars, c->c_arena);
   3870 }
   3871 
   3872 /* with_stmt: 'with' with_item (',' with_item)* ':' suite */
   3873 static stmt_ty
   3874 ast_for_with_stmt(struct compiling *c, const node *n0, bool is_async)
   3875 {
   3876     const node * const n = is_async ? CHILD(n0, 1) : n0;
   3877     int i, n_items;
   3878     asdl_seq *items, *body;
   3879 
   3880     REQ(n, with_stmt);
   3881 
   3882     n_items = (NCH(n) - 2) / 2;
   3883     items = _Py_asdl_seq_new(n_items, c->c_arena);
   3884     if (!items)
   3885         return NULL;
   3886     for (i = 1; i < NCH(n) - 2; i += 2) {
   3887         withitem_ty item = ast_for_with_item(c, CHILD(n, i));
   3888         if (!item)
   3889             return NULL;
   3890         asdl_seq_SET(items, (i - 1) / 2, item);
   3891     }
   3892 
   3893     body = ast_for_suite(c, CHILD(n, NCH(n) - 1));
   3894     if (!body)
   3895         return NULL;
   3896 
   3897     if (is_async)
   3898         return AsyncWith(items, body, LINENO(n0), n0->n_col_offset, c->c_arena);
   3899     else
   3900         return With(items, body, LINENO(n), n->n_col_offset, c->c_arena);
   3901 }
   3902 
   3903 static stmt_ty
   3904 ast_for_classdef(struct compiling *c, const node *n, asdl_seq *decorator_seq)
   3905 {
   3906     /* classdef: 'class' NAME ['(' arglist ')'] ':' suite */
   3907     PyObject *classname;
   3908     asdl_seq *s;
   3909     expr_ty call;
   3910 
   3911     REQ(n, classdef);
   3912 
   3913     if (NCH(n) == 4) { /* class NAME ':' suite */
   3914         s = ast_for_suite(c, CHILD(n, 3));
   3915         if (!s)
   3916             return NULL;
   3917         classname = NEW_IDENTIFIER(CHILD(n, 1));
   3918         if (!classname)
   3919             return NULL;
   3920         if (forbidden_name(c, classname, CHILD(n, 3), 0))
   3921             return NULL;
   3922         return ClassDef(classname, NULL, NULL, s, decorator_seq,
   3923                         LINENO(n), n->n_col_offset, c->c_arena);
   3924     }
   3925 
   3926     if (TYPE(CHILD(n, 3)) == RPAR) { /* class NAME '(' ')' ':' suite */
   3927         s = ast_for_suite(c, CHILD(n, 5));
   3928         if (!s)
   3929             return NULL;
   3930         classname = NEW_IDENTIFIER(CHILD(n, 1));
   3931         if (!classname)
   3932             return NULL;
   3933         if (forbidden_name(c, classname, CHILD(n, 3), 0))
   3934             return NULL;
   3935         return ClassDef(classname, NULL, NULL, s, decorator_seq,
   3936                         LINENO(n), n->n_col_offset, c->c_arena);
   3937     }
   3938 
   3939     /* class NAME '(' arglist ')' ':' suite */
   3940     /* build up a fake Call node so we can extract its pieces */
   3941     {
   3942         PyObject *dummy_name;
   3943         expr_ty dummy;
   3944         dummy_name = NEW_IDENTIFIER(CHILD(n, 1));
   3945         if (!dummy_name)
   3946             return NULL;
   3947         dummy = Name(dummy_name, Load, LINENO(n), n->n_col_offset, c->c_arena);
   3948         call = ast_for_call(c, CHILD(n, 3), dummy, false);
   3949         if (!call)
   3950             return NULL;
   3951     }
   3952     s = ast_for_suite(c, CHILD(n, 6));
   3953     if (!s)
   3954         return NULL;
   3955     classname = NEW_IDENTIFIER(CHILD(n, 1));
   3956     if (!classname)
   3957         return NULL;
   3958     if (forbidden_name(c, classname, CHILD(n, 1), 0))
   3959         return NULL;
   3960 
   3961     return ClassDef(classname, call->v.Call.args, call->v.Call.keywords, s,
   3962                     decorator_seq, LINENO(n), n->n_col_offset, c->c_arena);
   3963 }
   3964 
   3965 static stmt_ty
   3966 ast_for_stmt(struct compiling *c, const node *n)
   3967 {
   3968     if (TYPE(n) == stmt) {
   3969         assert(NCH(n) == 1);
   3970         n = CHILD(n, 0);
   3971     }
   3972     if (TYPE(n) == simple_stmt) {
   3973         assert(num_stmts(n) == 1);
   3974         n = CHILD(n, 0);
   3975     }
   3976     if (TYPE(n) == small_stmt) {
   3977         n = CHILD(n, 0);
   3978         /* small_stmt: expr_stmt | del_stmt | pass_stmt | flow_stmt
   3979                   | import_stmt | global_stmt | nonlocal_stmt | assert_stmt
   3980         */
   3981         switch (TYPE(n)) {
   3982             case expr_stmt:
   3983                 return ast_for_expr_stmt(c, n);
   3984             case del_stmt:
   3985                 return ast_for_del_stmt(c, n);
   3986             case pass_stmt:
   3987                 return Pass(LINENO(n), n->n_col_offset, c->c_arena);
   3988             case flow_stmt:
   3989                 return ast_for_flow_stmt(c, n);
   3990             case import_stmt:
   3991                 return ast_for_import_stmt(c, n);
   3992             case global_stmt:
   3993                 return ast_for_global_stmt(c, n);
   3994             case nonlocal_stmt:
   3995                 return ast_for_nonlocal_stmt(c, n);
   3996             case assert_stmt:
   3997                 return ast_for_assert_stmt(c, n);
   3998             default:
   3999                 PyErr_Format(PyExc_SystemError,
   4000                              "unhandled small_stmt: TYPE=%d NCH=%d\n",
   4001                              TYPE(n), NCH(n));
   4002                 return NULL;
   4003         }
   4004     }
   4005     else {
   4006         /* compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt
   4007                         | funcdef | classdef | decorated | async_stmt
   4008         */
   4009         node *ch = CHILD(n, 0);
   4010         REQ(n, compound_stmt);
   4011         switch (TYPE(ch)) {
   4012             case if_stmt:
   4013                 return ast_for_if_stmt(c, ch);
   4014             case while_stmt:
   4015                 return ast_for_while_stmt(c, ch);
   4016             case for_stmt:
   4017                 return ast_for_for_stmt(c, ch, 0);
   4018             case try_stmt:
   4019                 return ast_for_try_stmt(c, ch);
   4020             case with_stmt:
   4021                 return ast_for_with_stmt(c, ch, 0);
   4022             case funcdef:
   4023                 return ast_for_funcdef(c, ch, NULL);
   4024             case classdef:
   4025                 return ast_for_classdef(c, ch, NULL);
   4026             case decorated:
   4027                 return ast_for_decorated(c, ch);
   4028             case async_stmt:
   4029                 return ast_for_async_stmt(c, ch);
   4030             default:
   4031                 PyErr_Format(PyExc_SystemError,
   4032                              "unhandled small_stmt: TYPE=%d NCH=%d\n",
   4033                              TYPE(n), NCH(n));
   4034                 return NULL;
   4035         }
   4036     }
   4037 }
   4038 
   4039 static PyObject *
   4040 parsenumber_raw(struct compiling *c, const char *s)
   4041 {
   4042     const char *end;
   4043     long x;
   4044     double dx;
   4045     Py_complex compl;
   4046     int imflag;
   4047 
   4048     assert(s != NULL);
   4049     errno = 0;
   4050     end = s + strlen(s) - 1;
   4051     imflag = *end == 'j' || *end == 'J';
   4052     if (s[0] == '0') {
   4053         x = (long) PyOS_strtoul(s, (char **)&end, 0);
   4054         if (x < 0 && errno == 0) {
   4055             return PyLong_FromString(s, (char **)0, 0);
   4056         }
   4057     }
   4058     else
   4059         x = PyOS_strtol(s, (char **)&end, 0);
   4060     if (*end == '\0') {
   4061         if (errno != 0)
   4062             return PyLong_FromString(s, (char **)0, 0);
   4063         return PyLong_FromLong(x);
   4064     }
   4065     /* XXX Huge floats may silently fail */
   4066     if (imflag) {
   4067         compl.real = 0.;
   4068         compl.imag = PyOS_string_to_double(s, (char **)&end, NULL);
   4069         if (compl.imag == -1.0 && PyErr_Occurred())
   4070             return NULL;
   4071         return PyComplex_FromCComplex(compl);
   4072     }
   4073     else
   4074     {
   4075         dx = PyOS_string_to_double(s, NULL, NULL);
   4076         if (dx == -1.0 && PyErr_Occurred())
   4077             return NULL;
   4078         return PyFloat_FromDouble(dx);
   4079     }
   4080 }
   4081 
   4082 static PyObject *
   4083 parsenumber(struct compiling *c, const char *s)
   4084 {
   4085     char *dup, *end;
   4086     PyObject *res = NULL;
   4087 
   4088     assert(s != NULL);
   4089 
   4090     if (strchr(s, '_') == NULL) {
   4091         return parsenumber_raw(c, s);
   4092     }
   4093     /* Create a duplicate without underscores. */
   4094     dup = PyMem_Malloc(strlen(s) + 1);
   4095     if (dup == NULL) {
   4096         return PyErr_NoMemory();
   4097     }
   4098     end = dup;
   4099     for (; *s; s++) {
   4100         if (*s != '_') {
   4101             *end++ = *s;
   4102         }
   4103     }
   4104     *end = '\0';
   4105     res = parsenumber_raw(c, dup);
   4106     PyMem_Free(dup);
   4107     return res;
   4108 }
   4109 
   4110 static PyObject *
   4111 decode_utf8(struct compiling *c, const char **sPtr, const char *end)
   4112 {
   4113     const char *s, *t;
   4114     t = s = *sPtr;
   4115     /* while (s < end && *s != '\\') s++; */ /* inefficient for u".." */
   4116     while (s < end && (*s & 0x80)) s++;
   4117     *sPtr = s;
   4118     return PyUnicode_DecodeUTF8(t, s - t, NULL);
   4119 }
   4120 
   4121 static int
   4122 warn_invalid_escape_sequence(struct compiling *c, const node *n,
   4123                              unsigned char first_invalid_escape_char)
   4124 {
   4125     PyObject *msg = PyUnicode_FromFormat("invalid escape sequence \\%c",
   4126                                          first_invalid_escape_char);
   4127     if (msg == NULL) {
   4128         return -1;
   4129     }
   4130     if (PyErr_WarnExplicitObject(PyExc_DeprecationWarning, msg,
   4131                                    c->c_filename, LINENO(n),
   4132                                    NULL, NULL) < 0)
   4133     {
   4134         if (PyErr_ExceptionMatches(PyExc_DeprecationWarning)) {
   4135             const char *s;
   4136 
   4137             /* Replace the DeprecationWarning exception with a SyntaxError
   4138                to get a more accurate error report */
   4139             PyErr_Clear();
   4140 
   4141             s = PyUnicode_AsUTF8(msg);
   4142             if (s != NULL) {
   4143                 ast_error(c, n, s);
   4144             }
   4145         }
   4146         Py_DECREF(msg);
   4147         return -1;
   4148     }
   4149     Py_DECREF(msg);
   4150     return 0;
   4151 }
   4152 
   4153 static PyObject *
   4154 decode_unicode_with_escapes(struct compiling *c, const node *n, const char *s,
   4155                             size_t len)
   4156 {
   4157     PyObject *v, *u;
   4158     char *buf;
   4159     char *p;
   4160     const char *end;
   4161 
   4162     /* check for integer overflow */
   4163     if (len > SIZE_MAX / 6)
   4164         return NULL;
   4165     /* "" (2 bytes) may become "\U000000E4" (10 bytes), or 1:5
   4166        "\" (3 bytes) may become "\u005c\U000000E4" (16 bytes), or ~1:6 */
   4167     u = PyBytes_FromStringAndSize((char *)NULL, len * 6);
   4168     if (u == NULL)
   4169         return NULL;
   4170     p = buf = PyBytes_AsString(u);
   4171     end = s + len;
   4172     while (s < end) {
   4173         if (*s == '\\') {
   4174             *p++ = *s++;
   4175             if (s >= end || *s & 0x80) {
   4176                 strcpy(p, "u005c");
   4177                 p += 5;
   4178                 if (s >= end)
   4179                     break;
   4180             }
   4181         }
   4182         if (*s & 0x80) { /* XXX inefficient */
   4183             PyObject *w;
   4184             int kind;
   4185             void *data;
   4186             Py_ssize_t len, i;
   4187             w = decode_utf8(c, &s, end);
   4188             if (w == NULL) {
   4189                 Py_DECREF(u);
   4190                 return NULL;
   4191             }
   4192             kind = PyUnicode_KIND(w);
   4193             data = PyUnicode_DATA(w);
   4194             len = PyUnicode_GET_LENGTH(w);
   4195             for (i = 0; i < len; i++) {
   4196                 Py_UCS4 chr = PyUnicode_READ(kind, data, i);
   4197                 sprintf(p, "\\U%08x", chr);
   4198                 p += 10;
   4199             }
   4200             /* Should be impossible to overflow */
   4201             assert(p - buf <= PyBytes_GET_SIZE(u));
   4202             Py_DECREF(w);
   4203         } else {
   4204             *p++ = *s++;
   4205         }
   4206     }
   4207     len = p - buf;
   4208     s = buf;
   4209 
   4210     const char *first_invalid_escape;
   4211     v = _PyUnicode_DecodeUnicodeEscape(s, len, NULL, &first_invalid_escape);
   4212 
   4213     if (v != NULL && first_invalid_escape != NULL) {
   4214         if (warn_invalid_escape_sequence(c, n, *first_invalid_escape) < 0) {
   4215             /* We have not decref u before because first_invalid_escape points
   4216                inside u. */
   4217             Py_XDECREF(u);
   4218             Py_DECREF(v);
   4219             return NULL;
   4220         }
   4221     }
   4222     Py_XDECREF(u);
   4223     return v;
   4224 }
   4225 
   4226 static PyObject *
   4227 decode_bytes_with_escapes(struct compiling *c, const node *n, const char *s,
   4228                           size_t len)
   4229 {
   4230     const char *first_invalid_escape;
   4231     PyObject *result = _PyBytes_DecodeEscape(s, len, NULL, 0, NULL,
   4232                                              &first_invalid_escape);
   4233     if (result == NULL)
   4234         return NULL;
   4235 
   4236     if (first_invalid_escape != NULL) {
   4237         if (warn_invalid_escape_sequence(c, n, *first_invalid_escape) < 0) {
   4238             Py_DECREF(result);
   4239             return NULL;
   4240         }
   4241     }
   4242     return result;
   4243 }
   4244 
   4245 /* Shift locations for the given node and all its children by adding `lineno`
   4246    and `col_offset` to existing locations. */
   4247 static void fstring_shift_node_locations(node *n, int lineno, int col_offset)
   4248 {
   4249     n->n_col_offset = n->n_col_offset + col_offset;
   4250     for (int i = 0; i < NCH(n); ++i) {
   4251         if (n->n_lineno && n->n_lineno < CHILD(n, i)->n_lineno) {
   4252             /* Shifting column offsets unnecessary if there's been newlines. */
   4253             col_offset = 0;
   4254         }
   4255         fstring_shift_node_locations(CHILD(n, i), lineno, col_offset);
   4256     }
   4257     n->n_lineno = n->n_lineno + lineno;
   4258 }
   4259 
   4260 /* Fix locations for the given node and its children.
   4261 
   4262    `parent` is the enclosing node.
   4263    `n` is the node which locations are going to be fixed relative to parent.
   4264    `expr_str` is the child node's string representation, including braces.
   4265 */
   4266 static void
   4267 fstring_fix_node_location(const node *parent, node *n, char *expr_str)
   4268 {
   4269     char *substr = NULL;
   4270     char *start;
   4271     int lines = LINENO(parent) - 1;
   4272     int cols = parent->n_col_offset;
   4273     /* Find the full fstring to fix location information in `n`. */
   4274     while (parent && parent->n_type != STRING)
   4275         parent = parent->n_child;
   4276     if (parent && parent->n_str) {
   4277         substr = strstr(parent->n_str, expr_str);
   4278         if (substr) {
   4279             start = substr;
   4280             while (start > parent->n_str) {
   4281                 if (start[0] == '\n')
   4282                     break;
   4283                 start--;
   4284             }
   4285             cols += substr - start;
   4286             /* Fix lineno in mulitline strings. */
   4287             while ((substr = strchr(substr + 1, '\n')))
   4288                 lines--;
   4289         }
   4290     }
   4291     fstring_shift_node_locations(n, lines, cols);
   4292 }
   4293 
   4294 /* Compile this expression in to an expr_ty.  Add parens around the
   4295    expression, in order to allow leading spaces in the expression. */
   4296 static expr_ty
   4297 fstring_compile_expr(const char *expr_start, const char *expr_end,
   4298                      struct compiling *c, const node *n)
   4299 
   4300 {
   4301     PyCompilerFlags cf;
   4302     node *mod_n;
   4303     mod_ty mod;
   4304     char *str;
   4305     Py_ssize_t len;
   4306     const char *s;
   4307 
   4308     assert(expr_end >= expr_start);
   4309     assert(*(expr_start-1) == '{');
   4310     assert(*expr_end == '}' || *expr_end == '!' || *expr_end == ':');
   4311 
   4312     /* If the substring is all whitespace, it's an error.  We need to catch this
   4313        here, and not when we call PyParser_SimpleParseStringFlagsFilename,
   4314        because turning the expression '' in to '()' would go from being invalid
   4315        to valid. */
   4316     for (s = expr_start; s != expr_end; s++) {
   4317         char c = *s;
   4318         /* The Python parser ignores only the following whitespace
   4319            characters (\r already is converted to \n). */
   4320         if (!(c == ' ' || c == '\t' || c == '\n' || c == '\f')) {
   4321             break;
   4322         }
   4323     }
   4324     if (s == expr_end) {
   4325         ast_error(c, n, "f-string: empty expression not allowed");
   4326         return NULL;
   4327     }
   4328 
   4329     len = expr_end - expr_start;
   4330     /* Allocate 3 extra bytes: open paren, close paren, null byte. */
   4331     str = PyMem_RawMalloc(len + 3);
   4332     if (str == NULL) {
   4333         PyErr_NoMemory();
   4334         return NULL;
   4335     }
   4336 
   4337     str[0] = '(';
   4338     memcpy(str+1, expr_start, len);
   4339     str[len+1] = ')';
   4340     str[len+2] = 0;
   4341 
   4342     cf.cf_flags = PyCF_ONLY_AST;
   4343     mod_n = PyParser_SimpleParseStringFlagsFilename(str, "<fstring>",
   4344                                                     Py_eval_input, 0);
   4345     if (!mod_n) {
   4346         PyMem_RawFree(str);
   4347         return NULL;
   4348     }
   4349     /* Reuse str to find the correct column offset. */
   4350     str[0] = '{';
   4351     str[len+1] = '}';
   4352     fstring_fix_node_location(n, mod_n, str);
   4353     mod = PyAST_FromNode(mod_n, &cf, "<fstring>", c->c_arena);
   4354     PyMem_RawFree(str);
   4355     PyNode_Free(mod_n);
   4356     if (!mod)
   4357         return NULL;
   4358     return mod->v.Expression.body;
   4359 }
   4360 
   4361 /* Return -1 on error.
   4362 
   4363    Return 0 if we reached the end of the literal.
   4364 
   4365    Return 1 if we haven't reached the end of the literal, but we want
   4366    the caller to process the literal up to this point. Used for
   4367    doubled braces.
   4368 */
   4369 static int
   4370 fstring_find_literal(const char **str, const char *end, int raw,
   4371                      PyObject **literal, int recurse_lvl,
   4372                      struct compiling *c, const node *n)
   4373 {
   4374     /* Get any literal string. It ends when we hit an un-doubled left
   4375        brace (which isn't part of a unicode name escape such as
   4376        "\N{EULER CONSTANT}"), or the end of the string. */
   4377 
   4378     const char *s = *str;
   4379     const char *literal_start = s;
   4380     int result = 0;
   4381 
   4382     assert(*literal == NULL);
   4383     while (s < end) {
   4384         char ch = *s++;
   4385         if (!raw && ch == '\\' && s < end) {
   4386             ch = *s++;
   4387             if (ch == 'N') {
   4388                 if (s < end && *s++ == '{') {
   4389                     while (s < end && *s++ != '}') {
   4390                     }
   4391                     continue;
   4392                 }
   4393                 break;
   4394             }
   4395             if (ch == '{' && warn_invalid_escape_sequence(c, n, ch) < 0) {
   4396                 return -1;
   4397             }
   4398         }
   4399         if (ch == '{' || ch == '}') {
   4400             /* Check for doubled braces, but only at the top level. If
   4401                we checked at every level, then f'{0:{3}}' would fail
   4402                with the two closing braces. */
   4403             if (recurse_lvl == 0) {
   4404                 if (s < end && *s == ch) {
   4405                     /* We're going to tell the caller that the literal ends
   4406                        here, but that they should continue scanning. But also
   4407                        skip over the second brace when we resume scanning. */
   4408                     *str = s + 1;
   4409                     result = 1;
   4410                     goto done;
   4411                 }
   4412 
   4413                 /* Where a single '{' is the start of a new expression, a
   4414                    single '}' is not allowed. */
   4415                 if (ch == '}') {
   4416                     *str = s - 1;
   4417                     ast_error(c, n, "f-string: single '}' is not allowed");
   4418                     return -1;
   4419                 }
   4420             }
   4421             /* We're either at a '{', which means we're starting another
   4422                expression; or a '}', which means we're at the end of this
   4423                f-string (for a nested format_spec). */
   4424             s--;
   4425             break;
   4426         }
   4427     }
   4428     *str = s;
   4429     assert(s <= end);
   4430     assert(s == end || *s == '{' || *s == '}');
   4431 done:
   4432     if (literal_start != s) {
   4433         if (raw)
   4434             *literal = PyUnicode_DecodeUTF8Stateful(literal_start,
   4435                                                     s - literal_start,
   4436                                                     NULL, NULL);
   4437         else
   4438             *literal = decode_unicode_with_escapes(c, n, literal_start,
   4439                                                    s - literal_start);
   4440         if (!*literal)
   4441             return -1;
   4442     }
   4443     return result;
   4444 }
   4445 
   4446 /* Forward declaration because parsing is recursive. */
   4447 static expr_ty
   4448 fstring_parse(const char **str, const char *end, int raw, int recurse_lvl,
   4449               struct compiling *c, const node *n);
   4450 
   4451 /* Parse the f-string at *str, ending at end.  We know *str starts an
   4452    expression (so it must be a '{'). Returns the FormattedValue node,
   4453    which includes the expression, conversion character, and
   4454    format_spec expression.
   4455 
   4456    Note that I don't do a perfect job here: I don't make sure that a
   4457    closing brace doesn't match an opening paren, for example. It
   4458    doesn't need to error on all invalid expressions, just correctly
   4459    find the end of all valid ones. Any errors inside the expression
   4460    will be caught when we parse it later. */
   4461 static int
   4462 fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl,
   4463                   expr_ty *expression, struct compiling *c, const node *n)
   4464 {
   4465     /* Return -1 on error, else 0. */
   4466 
   4467     const char *expr_start;
   4468     const char *expr_end;
   4469     expr_ty simple_expression;
   4470     expr_ty format_spec = NULL; /* Optional format specifier. */
   4471     int conversion = -1; /* The conversion char. -1 if not specified. */
   4472 
   4473     /* 0 if we're not in a string, else the quote char we're trying to
   4474        match (single or double quote). */
   4475     char quote_char = 0;
   4476 
   4477     /* If we're inside a string, 1=normal, 3=triple-quoted. */
   4478     int string_type = 0;
   4479 
   4480     /* Keep track of nesting level for braces/parens/brackets in
   4481        expressions. */
   4482     Py_ssize_t nested_depth = 0;
   4483 
   4484     /* Can only nest one level deep. */
   4485     if (recurse_lvl >= 2) {
   4486         ast_error(c, n, "f-string: expressions nested too deeply");
   4487         return -1;
   4488     }
   4489 
   4490     /* The first char must be a left brace, or we wouldn't have gotten
   4491        here. Skip over it. */
   4492     assert(**str == '{');
   4493     *str += 1;
   4494 
   4495     expr_start = *str;
   4496     for (; *str < end; (*str)++) {
   4497         char ch;
   4498 
   4499         /* Loop invariants. */
   4500         assert(nested_depth >= 0);
   4501         assert(*str >= expr_start && *str < end);
   4502         if (quote_char)
   4503             assert(string_type == 1 || string_type == 3);
   4504         else
   4505             assert(string_type == 0);
   4506 
   4507         ch = **str;
   4508         /* Nowhere inside an expression is a backslash allowed. */
   4509         if (ch == '\\') {
   4510             /* Error: can't include a backslash character, inside
   4511                parens or strings or not. */
   4512             ast_error(c, n, "f-string expression part "
   4513                             "cannot include a backslash");
   4514             return -1;
   4515         }
   4516         if (quote_char) {
   4517             /* We're inside a string. See if we're at the end. */
   4518             /* This code needs to implement the same non-error logic
   4519                as tok_get from tokenizer.c, at the letter_quote
   4520                label. To actually share that code would be a
   4521                nightmare. But, it's unlikely to change and is small,
   4522                so duplicate it here. Note we don't need to catch all
   4523                of the errors, since they'll be caught when parsing the
   4524                expression. We just need to match the non-error
   4525                cases. Thus we can ignore \n in single-quoted strings,
   4526                for example. Or non-terminated strings. */
   4527             if (ch == quote_char) {
   4528                 /* Does this match the string_type (single or triple
   4529                    quoted)? */
   4530                 if (string_type == 3) {
   4531                     if (*str+2 < end && *(*str+1) == ch && *(*str+2) == ch) {
   4532                         /* We're at the end of a triple quoted string. */
   4533                         *str += 2;
   4534                         string_type = 0;
   4535                         quote_char = 0;
   4536                         continue;
   4537                     }
   4538                 } else {
   4539                     /* We're at the end of a normal string. */
   4540                     quote_char = 0;
   4541                     string_type = 0;
   4542                     continue;
   4543                 }
   4544             }
   4545         } else if (ch == '\'' || ch == '"') {
   4546             /* Is this a triple quoted string? */
   4547             if (*str+2 < end && *(*str+1) == ch && *(*str+2) == ch) {
   4548                 string_type = 3;
   4549                 *str += 2;
   4550             } else {
   4551                 /* Start of a normal string. */
   4552                 string_type = 1;
   4553             }
   4554             /* Start looking for the end of the string. */
   4555             quote_char = ch;
   4556         } else if (ch == '[' || ch == '{' || ch == '(') {
   4557             nested_depth++;
   4558         } else if (nested_depth != 0 &&
   4559                    (ch == ']' || ch == '}' || ch == ')')) {
   4560             nested_depth--;
   4561         } else if (ch == '#') {
   4562             /* Error: can't include a comment character, inside parens
   4563                or not. */
   4564             ast_error(c, n, "f-string expression part cannot include '#'");
   4565             return -1;
   4566         } else if (nested_depth == 0 &&
   4567                    (ch == '!' || ch == ':' || ch == '}')) {
   4568             /* First, test for the special case of "!=". Since '=' is
   4569                not an allowed conversion character, nothing is lost in
   4570                this test. */
   4571             if (ch == '!' && *str+1 < end && *(*str+1) == '=') {
   4572                 /* This isn't a conversion character, just continue. */
   4573                 continue;
   4574             }
   4575             /* Normal way out of this loop. */
   4576             break;
   4577         } else {
   4578             /* Just consume this char and loop around. */
   4579         }
   4580     }
   4581     expr_end = *str;
   4582     /* If we leave this loop in a string or with mismatched parens, we
   4583        don't care. We'll get a syntax error when compiling the
   4584        expression. But, we can produce a better error message, so
   4585        let's just do that.*/
   4586     if (quote_char) {
   4587         ast_error(c, n, "f-string: unterminated string");
   4588         return -1;
   4589     }
   4590     if (nested_depth) {
   4591         ast_error(c, n, "f-string: mismatched '(', '{', or '['");
   4592         return -1;
   4593     }
   4594 
   4595     if (*str >= end)
   4596         goto unexpected_end_of_string;
   4597 
   4598     /* Compile the expression as soon as possible, so we show errors
   4599        related to the expression before errors related to the
   4600        conversion or format_spec. */
   4601     simple_expression = fstring_compile_expr(expr_start, expr_end, c, n);
   4602     if (!simple_expression)
   4603         return -1;
   4604 
   4605     /* Check for a conversion char, if present. */
   4606     if (**str == '!') {
   4607         *str += 1;
   4608         if (*str >= end)
   4609             goto unexpected_end_of_string;
   4610 
   4611         conversion = **str;
   4612         *str += 1;
   4613 
   4614         /* Validate the conversion. */
   4615         if (!(conversion == 's' || conversion == 'r'
   4616               || conversion == 'a')) {
   4617             ast_error(c, n, "f-string: invalid conversion character: "
   4618                             "expected 's', 'r', or 'a'");
   4619             return -1;
   4620         }
   4621     }
   4622 
   4623     /* Check for the format spec, if present. */
   4624     if (*str >= end)
   4625         goto unexpected_end_of_string;
   4626     if (**str == ':') {
   4627         *str += 1;
   4628         if (*str >= end)
   4629             goto unexpected_end_of_string;
   4630 
   4631         /* Parse the format spec. */
   4632         format_spec = fstring_parse(str, end, raw, recurse_lvl+1, c, n);
   4633         if (!format_spec)
   4634             return -1;
   4635     }
   4636 
   4637     if (*str >= end || **str != '}')
   4638         goto unexpected_end_of_string;
   4639 
   4640     /* We're at a right brace. Consume it. */
   4641     assert(*str < end);
   4642     assert(**str == '}');
   4643     *str += 1;
   4644 
   4645     /* And now create the FormattedValue node that represents this
   4646        entire expression with the conversion and format spec. */
   4647     *expression = FormattedValue(simple_expression, conversion,
   4648                                  format_spec, LINENO(n), n->n_col_offset,
   4649                                  c->c_arena);
   4650     if (!*expression)
   4651         return -1;
   4652 
   4653     return 0;
   4654 
   4655 unexpected_end_of_string:
   4656     ast_error(c, n, "f-string: expecting '}'");
   4657     return -1;
   4658 }
   4659 
   4660 /* Return -1 on error.
   4661 
   4662    Return 0 if we have a literal (possible zero length) and an
   4663    expression (zero length if at the end of the string.
   4664 
   4665    Return 1 if we have a literal, but no expression, and we want the
   4666    caller to call us again. This is used to deal with doubled
   4667    braces.
   4668 
   4669    When called multiple times on the string 'a{{b{0}c', this function
   4670    will return:
   4671 
   4672    1. the literal 'a{' with no expression, and a return value
   4673       of 1. Despite the fact that there's no expression, the return
   4674       value of 1 means we're not finished yet.
   4675 
   4676    2. the literal 'b' and the expression '0', with a return value of
   4677       0. The fact that there's an expression means we're not finished.
   4678 
   4679    3. literal 'c' with no expression and a return value of 0. The
   4680       combination of the return value of 0 with no expression means
   4681       we're finished.
   4682 */
   4683 static int
   4684 fstring_find_literal_and_expr(const char **str, const char *end, int raw,
   4685                               int recurse_lvl, PyObject **literal,
   4686                               expr_ty *expression,
   4687                               struct compiling *c, const node *n)
   4688 {
   4689     int result;
   4690 
   4691     assert(*literal == NULL && *expression == NULL);
   4692 
   4693     /* Get any literal string. */
   4694     result = fstring_find_literal(str, end, raw, literal, recurse_lvl, c, n);
   4695     if (result < 0)
   4696         goto error;
   4697 
   4698     assert(result == 0 || result == 1);
   4699 
   4700     if (result == 1)
   4701         /* We have a literal, but don't look at the expression. */
   4702         return 1;
   4703 
   4704     if (*str >= end || **str == '}')
   4705         /* We're at the end of the string or the end of a nested
   4706            f-string: no expression. The top-level error case where we
   4707            expect to be at the end of the string but we're at a '}' is
   4708            handled later. */
   4709         return 0;
   4710 
   4711     /* We must now be the start of an expression, on a '{'. */
   4712     assert(**str == '{');
   4713 
   4714     if (fstring_find_expr(str, end, raw, recurse_lvl, expression, c, n) < 0)
   4715         goto error;
   4716 
   4717     return 0;
   4718 
   4719 error:
   4720     Py_CLEAR(*literal);
   4721     return -1;
   4722 }
   4723 
   4724 #define EXPRLIST_N_CACHED  64
   4725 
   4726 typedef struct {
   4727     /* Incrementally build an array of expr_ty, so be used in an
   4728        asdl_seq. Cache some small but reasonably sized number of
   4729        expr_ty's, and then after that start dynamically allocating,
   4730        doubling the number allocated each time. Note that the f-string
   4731        f'{0}a{1}' contains 3 expr_ty's: 2 FormattedValue's, and one
   4732        Str for the literal 'a'. So you add expr_ty's about twice as
   4733        fast as you add exressions in an f-string. */
   4734 
   4735     Py_ssize_t allocated;  /* Number we've allocated. */
   4736     Py_ssize_t size;       /* Number we've used. */
   4737     expr_ty    *p;         /* Pointer to the memory we're actually
   4738                               using. Will point to 'data' until we
   4739                               start dynamically allocating. */
   4740     expr_ty    data[EXPRLIST_N_CACHED];
   4741 } ExprList;
   4742 
   4743 #ifdef NDEBUG
   4744 #define ExprList_check_invariants(l)
   4745 #else
   4746 static void
   4747 ExprList_check_invariants(ExprList *l)
   4748 {
   4749     /* Check our invariants. Make sure this object is "live", and
   4750        hasn't been deallocated. */
   4751     assert(l->size >= 0);
   4752     assert(l->p != NULL);
   4753     if (l->size <= EXPRLIST_N_CACHED)
   4754         assert(l->data == l->p);
   4755 }
   4756 #endif
   4757 
   4758 static void
   4759 ExprList_Init(ExprList *l)
   4760 {
   4761     l->allocated = EXPRLIST_N_CACHED;
   4762     l->size = 0;
   4763 
   4764     /* Until we start allocating dynamically, p points to data. */
   4765     l->p = l->data;
   4766 
   4767     ExprList_check_invariants(l);
   4768 }
   4769 
   4770 static int
   4771 ExprList_Append(ExprList *l, expr_ty exp)
   4772 {
   4773     ExprList_check_invariants(l);
   4774     if (l->size >= l->allocated) {
   4775         /* We need to alloc (or realloc) the memory. */
   4776         Py_ssize_t new_size = l->allocated * 2;
   4777 
   4778         /* See if we've ever allocated anything dynamically. */
   4779         if (l->p == l->data) {
   4780             Py_ssize_t i;
   4781             /* We're still using the cached data. Switch to
   4782                alloc-ing. */
   4783             l->p = PyMem_RawMalloc(sizeof(expr_ty) * new_size);
   4784             if (!l->p)
   4785                 return -1;
   4786             /* Copy the cached data into the new buffer. */
   4787             for (i = 0; i < l->size; i++)
   4788                 l->p[i] = l->data[i];
   4789         } else {
   4790             /* Just realloc. */
   4791             expr_ty *tmp = PyMem_RawRealloc(l->p, sizeof(expr_ty) * new_size);
   4792             if (!tmp) {
   4793                 PyMem_RawFree(l->p);
   4794                 l->p = NULL;
   4795                 return -1;
   4796             }
   4797             l->p = tmp;
   4798         }
   4799 
   4800         l->allocated = new_size;
   4801         assert(l->allocated == 2 * l->size);
   4802     }
   4803 
   4804     l->p[l->size++] = exp;
   4805 
   4806     ExprList_check_invariants(l);
   4807     return 0;
   4808 }
   4809 
   4810 static void
   4811 ExprList_Dealloc(ExprList *l)
   4812 {
   4813     ExprList_check_invariants(l);
   4814 
   4815     /* If there's been an error, or we've never dynamically allocated,
   4816        do nothing. */
   4817     if (!l->p || l->p == l->data) {
   4818         /* Do nothing. */
   4819     } else {
   4820         /* We have dynamically allocated. Free the memory. */
   4821         PyMem_RawFree(l->p);
   4822     }
   4823     l->p = NULL;
   4824     l->size = -1;
   4825 }
   4826 
   4827 static asdl_seq *
   4828 ExprList_Finish(ExprList *l, PyArena *arena)
   4829 {
   4830     asdl_seq *seq;
   4831 
   4832     ExprList_check_invariants(l);
   4833 
   4834     /* Allocate the asdl_seq and copy the expressions in to it. */
   4835     seq = _Py_asdl_seq_new(l->size, arena);
   4836     if (seq) {
   4837         Py_ssize_t i;
   4838         for (i = 0; i < l->size; i++)
   4839             asdl_seq_SET(seq, i, l->p[i]);
   4840     }
   4841     ExprList_Dealloc(l);
   4842     return seq;
   4843 }
   4844 
   4845 /* The FstringParser is designed to add a mix of strings and
   4846    f-strings, and concat them together as needed. Ultimately, it
   4847    generates an expr_ty. */
   4848 typedef struct {
   4849     PyObject *last_str;
   4850     ExprList expr_list;
   4851     int fmode;
   4852 } FstringParser;
   4853 
   4854 #ifdef NDEBUG
   4855 #define FstringParser_check_invariants(state)
   4856 #else
   4857 static void
   4858 FstringParser_check_invariants(FstringParser *state)
   4859 {
   4860     if (state->last_str)
   4861         assert(PyUnicode_CheckExact(state->last_str));
   4862     ExprList_check_invariants(&state->expr_list);
   4863 }
   4864 #endif
   4865 
   4866 static void
   4867 FstringParser_Init(FstringParser *state)
   4868 {
   4869     state->last_str = NULL;
   4870     state->fmode = 0;
   4871     ExprList_Init(&state->expr_list);
   4872     FstringParser_check_invariants(state);
   4873 }
   4874 
   4875 static void
   4876 FstringParser_Dealloc(FstringParser *state)
   4877 {
   4878     FstringParser_check_invariants(state);
   4879 
   4880     Py_XDECREF(state->last_str);
   4881     ExprList_Dealloc(&state->expr_list);
   4882 }
   4883 
   4884 /* Make a Str node, but decref the PyUnicode object being added. */
   4885 static expr_ty
   4886 make_str_node_and_del(PyObject **str, struct compiling *c, const node* n)
   4887 {
   4888     PyObject *s = *str;
   4889     *str = NULL;
   4890     assert(PyUnicode_CheckExact(s));
   4891     if (PyArena_AddPyObject(c->c_arena, s) < 0) {
   4892         Py_DECREF(s);
   4893         return NULL;
   4894     }
   4895     return Str(s, LINENO(n), n->n_col_offset, c->c_arena);
   4896 }
   4897 
   4898 /* Add a non-f-string (that is, a regular literal string). str is
   4899    decref'd. */
   4900 static int
   4901 FstringParser_ConcatAndDel(FstringParser *state, PyObject *str)
   4902 {
   4903     FstringParser_check_invariants(state);
   4904 
   4905     assert(PyUnicode_CheckExact(str));
   4906 
   4907     if (PyUnicode_GET_LENGTH(str) == 0) {
   4908         Py_DECREF(str);
   4909         return 0;
   4910     }
   4911 
   4912     if (!state->last_str) {
   4913         /* We didn't have a string before, so just remember this one. */
   4914         state->last_str = str;
   4915     } else {
   4916         /* Concatenate this with the previous string. */
   4917         PyUnicode_AppendAndDel(&state->last_str, str);
   4918         if (!state->last_str)
   4919             return -1;
   4920     }
   4921     FstringParser_check_invariants(state);
   4922     return 0;
   4923 }
   4924 
   4925 /* Parse an f-string. The f-string is in *str to end, with no
   4926    'f' or quotes. */
   4927 static int
   4928 FstringParser_ConcatFstring(FstringParser *state, const char **str,
   4929                             const char *end, int raw, int recurse_lvl,
   4930                             struct compiling *c, const node *n)
   4931 {
   4932     FstringParser_check_invariants(state);
   4933     state->fmode = 1;
   4934 
   4935     /* Parse the f-string. */
   4936     while (1) {
   4937         PyObject *literal = NULL;
   4938         expr_ty expression = NULL;
   4939 
   4940         /* If there's a zero length literal in front of the
   4941            expression, literal will be NULL. If we're at the end of
   4942            the f-string, expression will be NULL (unless result == 1,
   4943            see below). */
   4944         int result = fstring_find_literal_and_expr(str, end, raw, recurse_lvl,
   4945                                                    &literal, &expression,
   4946                                                    c, n);
   4947         if (result < 0)
   4948             return -1;
   4949 
   4950         /* Add the literal, if any. */
   4951         if (!literal) {
   4952             /* Do nothing. Just leave last_str alone (and possibly
   4953                NULL). */
   4954         } else if (!state->last_str) {
   4955             /*  Note that the literal can be zero length, if the
   4956                 input string is "\\\n" or "\\\r", among others. */
   4957             state->last_str = literal;
   4958             literal = NULL;
   4959         } else {
   4960             /* We have a literal, concatenate it. */
   4961             assert(PyUnicode_GET_LENGTH(literal) != 0);
   4962             if (FstringParser_ConcatAndDel(state, literal) < 0)
   4963                 return -1;
   4964             literal = NULL;
   4965         }
   4966 
   4967         /* We've dealt with the literal now. It can't be leaked on further
   4968            errors. */
   4969         assert(literal == NULL);
   4970 
   4971         /* See if we should just loop around to get the next literal
   4972            and expression, while ignoring the expression this
   4973            time. This is used for un-doubling braces, as an
   4974            optimization. */
   4975         if (result == 1)
   4976             continue;
   4977 
   4978         if (!expression)
   4979             /* We're done with this f-string. */
   4980             break;
   4981 
   4982         /* We know we have an expression. Convert any existing string
   4983            to a Str node. */
   4984         if (!state->last_str) {
   4985             /* Do nothing. No previous literal. */
   4986         } else {
   4987             /* Convert the existing last_str literal to a Str node. */
   4988             expr_ty str = make_str_node_and_del(&state->last_str, c, n);
   4989             if (!str || ExprList_Append(&state->expr_list, str) < 0)
   4990                 return -1;
   4991         }
   4992 
   4993         if (ExprList_Append(&state->expr_list, expression) < 0)
   4994             return -1;
   4995     }
   4996 
   4997     /* If recurse_lvl is zero, then we must be at the end of the
   4998        string. Otherwise, we must be at a right brace. */
   4999 
   5000     if (recurse_lvl == 0 && *str < end-1) {
   5001         ast_error(c, n, "f-string: unexpected end of string");
   5002         return -1;
   5003     }
   5004     if (recurse_lvl != 0 && **str != '}') {
   5005         ast_error(c, n, "f-string: expecting '}'");
   5006         return -1;
   5007     }
   5008 
   5009     FstringParser_check_invariants(state);
   5010     return 0;
   5011 }
   5012 
   5013 /* Convert the partial state reflected in last_str and expr_list to an
   5014    expr_ty. The expr_ty can be a Str, or a JoinedStr. */
   5015 static expr_ty
   5016 FstringParser_Finish(FstringParser *state, struct compiling *c,
   5017                      const node *n)
   5018 {
   5019     asdl_seq *seq;
   5020 
   5021     FstringParser_check_invariants(state);
   5022 
   5023     /* If we're just a constant string with no expressions, return
   5024        that. */
   5025     if (!state->fmode) {
   5026         assert(!state->expr_list.size);
   5027         if (!state->last_str) {
   5028             /* Create a zero length string. */
   5029             state->last_str = PyUnicode_FromStringAndSize(NULL, 0);
   5030             if (!state->last_str)
   5031                 goto error;
   5032         }
   5033         return make_str_node_and_del(&state->last_str, c, n);
   5034     }
   5035 
   5036     /* Create a Str node out of last_str, if needed. It will be the
   5037        last node in our expression list. */
   5038     if (state->last_str) {
   5039         expr_ty str = make_str_node_and_del(&state->last_str, c, n);
   5040         if (!str || ExprList_Append(&state->expr_list, str) < 0)
   5041             goto error;
   5042     }
   5043     /* This has already been freed. */
   5044     assert(state->last_str == NULL);
   5045 
   5046     seq = ExprList_Finish(&state->expr_list, c->c_arena);
   5047     if (!seq)
   5048         goto error;
   5049 
   5050     return JoinedStr(seq, LINENO(n), n->n_col_offset, c->c_arena);
   5051 
   5052 error:
   5053     FstringParser_Dealloc(state);
   5054     return NULL;
   5055 }
   5056 
   5057 /* Given an f-string (with no 'f' or quotes) that's in *str and ends
   5058    at end, parse it into an expr_ty.  Return NULL on error.  Adjust
   5059    str to point past the parsed portion. */
   5060 static expr_ty
   5061 fstring_parse(const char **str, const char *end, int raw, int recurse_lvl,
   5062               struct compiling *c, const node *n)
   5063 {
   5064     FstringParser state;
   5065 
   5066     FstringParser_Init(&state);
   5067     if (FstringParser_ConcatFstring(&state, str, end, raw, recurse_lvl,
   5068                                     c, n) < 0) {
   5069         FstringParser_Dealloc(&state);
   5070         return NULL;
   5071     }
   5072 
   5073     return FstringParser_Finish(&state, c, n);
   5074 }
   5075 
   5076 /* n is a Python string literal, including the bracketing quote
   5077    characters, and r, b, u, &/or f prefixes (if any), and embedded
   5078    escape sequences (if any). parsestr parses it, and sets *result to
   5079    decoded Python string object.  If the string is an f-string, set
   5080    *fstr and *fstrlen to the unparsed string object.  Return 0 if no
   5081    errors occurred.
   5082 */
   5083 static int
   5084 parsestr(struct compiling *c, const node *n, int *bytesmode, int *rawmode,
   5085          PyObject **result, const char **fstr, Py_ssize_t *fstrlen)
   5086 {
   5087     size_t len;
   5088     const char *s = STR(n);
   5089     int quote = Py_CHARMASK(*s);
   5090     int fmode = 0;
   5091     *bytesmode = 0;
   5092     *rawmode = 0;
   5093     *result = NULL;
   5094     *fstr = NULL;
   5095     if (Py_ISALPHA(quote)) {
   5096         while (!*bytesmode || !*rawmode) {
   5097             if (quote == 'b' || quote == 'B') {
   5098                 quote = *++s;
   5099                 *bytesmode = 1;
   5100             }
   5101             else if (quote == 'u' || quote == 'U') {
   5102                 quote = *++s;
   5103             }
   5104             else if (quote == 'r' || quote == 'R') {
   5105                 quote = *++s;
   5106                 *rawmode = 1;
   5107             }
   5108             else if (quote == 'f' || quote == 'F') {
   5109                 quote = *++s;
   5110                 fmode = 1;
   5111             }
   5112             else {
   5113                 break;
   5114             }
   5115         }
   5116     }
   5117     if (fmode && *bytesmode) {
   5118         PyErr_BadInternalCall();
   5119         return -1;
   5120     }
   5121     if (quote != '\'' && quote != '\"') {
   5122         PyErr_BadInternalCall();
   5123         return -1;
   5124     }
   5125     /* Skip the leading quote char. */
   5126     s++;
   5127     len = strlen(s);
   5128     if (len > INT_MAX) {
   5129         PyErr_SetString(PyExc_OverflowError,
   5130                         "string to parse is too long");
   5131         return -1;
   5132     }
   5133     if (s[--len] != quote) {
   5134         /* Last quote char must match the first. */
   5135         PyErr_BadInternalCall();
   5136         return -1;
   5137     }
   5138     if (len >= 4 && s[0] == quote && s[1] == quote) {
   5139         /* A triple quoted string. We've already skipped one quote at
   5140            the start and one at the end of the string. Now skip the
   5141            two at the start. */
   5142         s += 2;
   5143         len -= 2;
   5144         /* And check that the last two match. */
   5145         if (s[--len] != quote || s[--len] != quote) {
   5146             PyErr_BadInternalCall();
   5147             return -1;
   5148         }
   5149     }
   5150 
   5151     if (fmode) {
   5152         /* Just return the bytes. The caller will parse the resulting
   5153            string. */
   5154         *fstr = s;
   5155         *fstrlen = len;
   5156         return 0;
   5157     }
   5158 
   5159     /* Not an f-string. */
   5160     /* Avoid invoking escape decoding routines if possible. */
   5161     *rawmode = *rawmode || strchr(s, '\\') == NULL;
   5162     if (*bytesmode) {
   5163         /* Disallow non-ASCII characters. */
   5164         const char *ch;
   5165         for (ch = s; *ch; ch++) {
   5166             if (Py_CHARMASK(*ch) >= 0x80) {
   5167                 ast_error(c, n, "bytes can only contain ASCII "
   5168                           "literal characters.");
   5169                 return -1;
   5170             }
   5171         }
   5172         if (*rawmode)
   5173             *result = PyBytes_FromStringAndSize(s, len);
   5174         else
   5175             *result = decode_bytes_with_escapes(c, n, s, len);
   5176     } else {
   5177         if (*rawmode)
   5178             *result = PyUnicode_DecodeUTF8Stateful(s, len, NULL, NULL);
   5179         else
   5180             *result = decode_unicode_with_escapes(c, n, s, len);
   5181     }
   5182     return *result == NULL ? -1 : 0;
   5183 }
   5184 
   5185 /* Accepts a STRING+ atom, and produces an expr_ty node. Run through
   5186    each STRING atom, and process it as needed. For bytes, just
   5187    concatenate them together, and the result will be a Bytes node. For
   5188    normal strings and f-strings, concatenate them together. The result
   5189    will be a Str node if there were no f-strings; a FormattedValue
   5190    node if there's just an f-string (with no leading or trailing
   5191    literals), or a JoinedStr node if there are multiple f-strings or
   5192    any literals involved. */
   5193 static expr_ty
   5194 parsestrplus(struct compiling *c, const node *n)
   5195 {
   5196     int bytesmode = 0;
   5197     PyObject *bytes_str = NULL;
   5198     int i;
   5199 
   5200     FstringParser state;
   5201     FstringParser_Init(&state);
   5202 
   5203     for (i = 0; i < NCH(n); i++) {
   5204         int this_bytesmode;
   5205         int this_rawmode;
   5206         PyObject *s;
   5207         const char *fstr;
   5208         Py_ssize_t fstrlen = -1;  /* Silence a compiler warning. */
   5209 
   5210         REQ(CHILD(n, i), STRING);
   5211         if (parsestr(c, CHILD(n, i), &this_bytesmode, &this_rawmode, &s,
   5212                      &fstr, &fstrlen) != 0)
   5213             goto error;
   5214 
   5215         /* Check that we're not mixing bytes with unicode. */
   5216         if (i != 0 && bytesmode != this_bytesmode) {
   5217             ast_error(c, n, "cannot mix bytes and nonbytes literals");
   5218             /* s is NULL if the current string part is an f-string. */
   5219             Py_XDECREF(s);
   5220             goto error;
   5221         }
   5222         bytesmode = this_bytesmode;
   5223 
   5224         if (fstr != NULL) {
   5225             int result;
   5226             assert(s == NULL && !bytesmode);
   5227             /* This is an f-string. Parse and concatenate it. */
   5228             result = FstringParser_ConcatFstring(&state, &fstr, fstr+fstrlen,
   5229                                                  this_rawmode, 0, c, n);
   5230             if (result < 0)
   5231                 goto error;
   5232         } else {
   5233             /* A string or byte string. */
   5234             assert(s != NULL && fstr == NULL);
   5235 
   5236             assert(bytesmode ? PyBytes_CheckExact(s) :
   5237                    PyUnicode_CheckExact(s));
   5238 
   5239             if (bytesmode) {
   5240                 /* For bytes, concat as we go. */
   5241                 if (i == 0) {
   5242                     /* First time, just remember this value. */
   5243                     bytes_str = s;
   5244                 } else {
   5245                     PyBytes_ConcatAndDel(&bytes_str, s);
   5246                     if (!bytes_str)
   5247                         goto error;
   5248                 }
   5249             } else {
   5250                 /* This is a regular string. Concatenate it. */
   5251                 if (FstringParser_ConcatAndDel(&state, s) < 0)
   5252                     goto error;
   5253             }
   5254         }
   5255     }
   5256     if (bytesmode) {
   5257         /* Just return the bytes object and we're done. */
   5258         if (PyArena_AddPyObject(c->c_arena, bytes_str) < 0)
   5259             goto error;
   5260         return Bytes(bytes_str, LINENO(n), n->n_col_offset, c->c_arena);
   5261     }
   5262 
   5263     /* We're not a bytes string, bytes_str should never have been set. */
   5264     assert(bytes_str == NULL);
   5265 
   5266     return FstringParser_Finish(&state, c, n);
   5267 
   5268 error:
   5269     Py_XDECREF(bytes_str);
   5270     FstringParser_Dealloc(&state);
   5271     return NULL;
   5272 }
   5273