17db96d56Sopenharmony_ci#include <Python.h>
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci#include "pegen.h"
47db96d56Sopenharmony_ci#include "string_parser.h"
57db96d56Sopenharmony_ci
67db96d56Sopenharmony_cistatic PyObject *
77db96d56Sopenharmony_ci_create_dummy_identifier(Parser *p)
87db96d56Sopenharmony_ci{
97db96d56Sopenharmony_ci    return _PyPegen_new_identifier(p, "");
107db96d56Sopenharmony_ci}
117db96d56Sopenharmony_ci
127db96d56Sopenharmony_civoid *
137db96d56Sopenharmony_ci_PyPegen_dummy_name(Parser *p, ...)
147db96d56Sopenharmony_ci{
157db96d56Sopenharmony_ci    static void *cache = NULL;
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ci    if (cache != NULL) {
187db96d56Sopenharmony_ci        return cache;
197db96d56Sopenharmony_ci    }
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci    PyObject *id = _create_dummy_identifier(p);
227db96d56Sopenharmony_ci    if (!id) {
237db96d56Sopenharmony_ci        return NULL;
247db96d56Sopenharmony_ci    }
257db96d56Sopenharmony_ci    cache = _PyAST_Name(id, Load, 1, 0, 1, 0, p->arena);
267db96d56Sopenharmony_ci    return cache;
277db96d56Sopenharmony_ci}
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_ci/* Creates a single-element asdl_seq* that contains a */
307db96d56Sopenharmony_ciasdl_seq *
317db96d56Sopenharmony_ci_PyPegen_singleton_seq(Parser *p, void *a)
327db96d56Sopenharmony_ci{
337db96d56Sopenharmony_ci    assert(a != NULL);
347db96d56Sopenharmony_ci    asdl_seq *seq = (asdl_seq*)_Py_asdl_generic_seq_new(1, p->arena);
357db96d56Sopenharmony_ci    if (!seq) {
367db96d56Sopenharmony_ci        return NULL;
377db96d56Sopenharmony_ci    }
387db96d56Sopenharmony_ci    asdl_seq_SET_UNTYPED(seq, 0, a);
397db96d56Sopenharmony_ci    return seq;
407db96d56Sopenharmony_ci}
417db96d56Sopenharmony_ci
427db96d56Sopenharmony_ci/* Creates a copy of seq and prepends a to it */
437db96d56Sopenharmony_ciasdl_seq *
447db96d56Sopenharmony_ci_PyPegen_seq_insert_in_front(Parser *p, void *a, asdl_seq *seq)
457db96d56Sopenharmony_ci{
467db96d56Sopenharmony_ci    assert(a != NULL);
477db96d56Sopenharmony_ci    if (!seq) {
487db96d56Sopenharmony_ci        return _PyPegen_singleton_seq(p, a);
497db96d56Sopenharmony_ci    }
507db96d56Sopenharmony_ci
517db96d56Sopenharmony_ci    asdl_seq *new_seq = (asdl_seq*)_Py_asdl_generic_seq_new(asdl_seq_LEN(seq) + 1, p->arena);
527db96d56Sopenharmony_ci    if (!new_seq) {
537db96d56Sopenharmony_ci        return NULL;
547db96d56Sopenharmony_ci    }
557db96d56Sopenharmony_ci
567db96d56Sopenharmony_ci    asdl_seq_SET_UNTYPED(new_seq, 0, a);
577db96d56Sopenharmony_ci    for (Py_ssize_t i = 1, l = asdl_seq_LEN(new_seq); i < l; i++) {
587db96d56Sopenharmony_ci        asdl_seq_SET_UNTYPED(new_seq, i, asdl_seq_GET_UNTYPED(seq, i - 1));
597db96d56Sopenharmony_ci    }
607db96d56Sopenharmony_ci    return new_seq;
617db96d56Sopenharmony_ci}
627db96d56Sopenharmony_ci
637db96d56Sopenharmony_ci/* Creates a copy of seq and appends a to it */
647db96d56Sopenharmony_ciasdl_seq *
657db96d56Sopenharmony_ci_PyPegen_seq_append_to_end(Parser *p, asdl_seq *seq, void *a)
667db96d56Sopenharmony_ci{
677db96d56Sopenharmony_ci    assert(a != NULL);
687db96d56Sopenharmony_ci    if (!seq) {
697db96d56Sopenharmony_ci        return _PyPegen_singleton_seq(p, a);
707db96d56Sopenharmony_ci    }
717db96d56Sopenharmony_ci
727db96d56Sopenharmony_ci    asdl_seq *new_seq = (asdl_seq*)_Py_asdl_generic_seq_new(asdl_seq_LEN(seq) + 1, p->arena);
737db96d56Sopenharmony_ci    if (!new_seq) {
747db96d56Sopenharmony_ci        return NULL;
757db96d56Sopenharmony_ci    }
767db96d56Sopenharmony_ci
777db96d56Sopenharmony_ci    for (Py_ssize_t i = 0, l = asdl_seq_LEN(new_seq); i + 1 < l; i++) {
787db96d56Sopenharmony_ci        asdl_seq_SET_UNTYPED(new_seq, i, asdl_seq_GET_UNTYPED(seq, i));
797db96d56Sopenharmony_ci    }
807db96d56Sopenharmony_ci    asdl_seq_SET_UNTYPED(new_seq, asdl_seq_LEN(new_seq) - 1, a);
817db96d56Sopenharmony_ci    return new_seq;
827db96d56Sopenharmony_ci}
837db96d56Sopenharmony_ci
847db96d56Sopenharmony_cistatic Py_ssize_t
857db96d56Sopenharmony_ci_get_flattened_seq_size(asdl_seq *seqs)
867db96d56Sopenharmony_ci{
877db96d56Sopenharmony_ci    Py_ssize_t size = 0;
887db96d56Sopenharmony_ci    for (Py_ssize_t i = 0, l = asdl_seq_LEN(seqs); i < l; i++) {
897db96d56Sopenharmony_ci        asdl_seq *inner_seq = asdl_seq_GET_UNTYPED(seqs, i);
907db96d56Sopenharmony_ci        size += asdl_seq_LEN(inner_seq);
917db96d56Sopenharmony_ci    }
927db96d56Sopenharmony_ci    return size;
937db96d56Sopenharmony_ci}
947db96d56Sopenharmony_ci
957db96d56Sopenharmony_ci/* Flattens an asdl_seq* of asdl_seq*s */
967db96d56Sopenharmony_ciasdl_seq *
977db96d56Sopenharmony_ci_PyPegen_seq_flatten(Parser *p, asdl_seq *seqs)
987db96d56Sopenharmony_ci{
997db96d56Sopenharmony_ci    Py_ssize_t flattened_seq_size = _get_flattened_seq_size(seqs);
1007db96d56Sopenharmony_ci    assert(flattened_seq_size > 0);
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_ci    asdl_seq *flattened_seq = (asdl_seq*)_Py_asdl_generic_seq_new(flattened_seq_size, p->arena);
1037db96d56Sopenharmony_ci    if (!flattened_seq) {
1047db96d56Sopenharmony_ci        return NULL;
1057db96d56Sopenharmony_ci    }
1067db96d56Sopenharmony_ci
1077db96d56Sopenharmony_ci    int flattened_seq_idx = 0;
1087db96d56Sopenharmony_ci    for (Py_ssize_t i = 0, l = asdl_seq_LEN(seqs); i < l; i++) {
1097db96d56Sopenharmony_ci        asdl_seq *inner_seq = asdl_seq_GET_UNTYPED(seqs, i);
1107db96d56Sopenharmony_ci        for (Py_ssize_t j = 0, li = asdl_seq_LEN(inner_seq); j < li; j++) {
1117db96d56Sopenharmony_ci            asdl_seq_SET_UNTYPED(flattened_seq, flattened_seq_idx++, asdl_seq_GET_UNTYPED(inner_seq, j));
1127db96d56Sopenharmony_ci        }
1137db96d56Sopenharmony_ci    }
1147db96d56Sopenharmony_ci    assert(flattened_seq_idx == flattened_seq_size);
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ci    return flattened_seq;
1177db96d56Sopenharmony_ci}
1187db96d56Sopenharmony_ci
1197db96d56Sopenharmony_civoid *
1207db96d56Sopenharmony_ci_PyPegen_seq_last_item(asdl_seq *seq)
1217db96d56Sopenharmony_ci{
1227db96d56Sopenharmony_ci    Py_ssize_t len = asdl_seq_LEN(seq);
1237db96d56Sopenharmony_ci    return asdl_seq_GET_UNTYPED(seq, len - 1);
1247db96d56Sopenharmony_ci}
1257db96d56Sopenharmony_ci
1267db96d56Sopenharmony_civoid *
1277db96d56Sopenharmony_ci_PyPegen_seq_first_item(asdl_seq *seq)
1287db96d56Sopenharmony_ci{
1297db96d56Sopenharmony_ci    return asdl_seq_GET_UNTYPED(seq, 0);
1307db96d56Sopenharmony_ci}
1317db96d56Sopenharmony_ci
1327db96d56Sopenharmony_ci/* Creates a new name of the form <first_name>.<second_name> */
1337db96d56Sopenharmony_ciexpr_ty
1347db96d56Sopenharmony_ci_PyPegen_join_names_with_dot(Parser *p, expr_ty first_name, expr_ty second_name)
1357db96d56Sopenharmony_ci{
1367db96d56Sopenharmony_ci    assert(first_name != NULL && second_name != NULL);
1377db96d56Sopenharmony_ci    PyObject *first_identifier = first_name->v.Name.id;
1387db96d56Sopenharmony_ci    PyObject *second_identifier = second_name->v.Name.id;
1397db96d56Sopenharmony_ci
1407db96d56Sopenharmony_ci    if (PyUnicode_READY(first_identifier) == -1) {
1417db96d56Sopenharmony_ci        return NULL;
1427db96d56Sopenharmony_ci    }
1437db96d56Sopenharmony_ci    if (PyUnicode_READY(second_identifier) == -1) {
1447db96d56Sopenharmony_ci        return NULL;
1457db96d56Sopenharmony_ci    }
1467db96d56Sopenharmony_ci    const char *first_str = PyUnicode_AsUTF8(first_identifier);
1477db96d56Sopenharmony_ci    if (!first_str) {
1487db96d56Sopenharmony_ci        return NULL;
1497db96d56Sopenharmony_ci    }
1507db96d56Sopenharmony_ci    const char *second_str = PyUnicode_AsUTF8(second_identifier);
1517db96d56Sopenharmony_ci    if (!second_str) {
1527db96d56Sopenharmony_ci        return NULL;
1537db96d56Sopenharmony_ci    }
1547db96d56Sopenharmony_ci    Py_ssize_t len = strlen(first_str) + strlen(second_str) + 1;  // +1 for the dot
1557db96d56Sopenharmony_ci
1567db96d56Sopenharmony_ci    PyObject *str = PyBytes_FromStringAndSize(NULL, len);
1577db96d56Sopenharmony_ci    if (!str) {
1587db96d56Sopenharmony_ci        return NULL;
1597db96d56Sopenharmony_ci    }
1607db96d56Sopenharmony_ci
1617db96d56Sopenharmony_ci    char *s = PyBytes_AS_STRING(str);
1627db96d56Sopenharmony_ci    if (!s) {
1637db96d56Sopenharmony_ci        return NULL;
1647db96d56Sopenharmony_ci    }
1657db96d56Sopenharmony_ci
1667db96d56Sopenharmony_ci    strcpy(s, first_str);
1677db96d56Sopenharmony_ci    s += strlen(first_str);
1687db96d56Sopenharmony_ci    *s++ = '.';
1697db96d56Sopenharmony_ci    strcpy(s, second_str);
1707db96d56Sopenharmony_ci    s += strlen(second_str);
1717db96d56Sopenharmony_ci    *s = '\0';
1727db96d56Sopenharmony_ci
1737db96d56Sopenharmony_ci    PyObject *uni = PyUnicode_DecodeUTF8(PyBytes_AS_STRING(str), PyBytes_GET_SIZE(str), NULL);
1747db96d56Sopenharmony_ci    Py_DECREF(str);
1757db96d56Sopenharmony_ci    if (!uni) {
1767db96d56Sopenharmony_ci        return NULL;
1777db96d56Sopenharmony_ci    }
1787db96d56Sopenharmony_ci    PyUnicode_InternInPlace(&uni);
1797db96d56Sopenharmony_ci    if (_PyArena_AddPyObject(p->arena, uni) < 0) {
1807db96d56Sopenharmony_ci        Py_DECREF(uni);
1817db96d56Sopenharmony_ci        return NULL;
1827db96d56Sopenharmony_ci    }
1837db96d56Sopenharmony_ci
1847db96d56Sopenharmony_ci    return _PyAST_Name(uni, Load, EXTRA_EXPR(first_name, second_name));
1857db96d56Sopenharmony_ci}
1867db96d56Sopenharmony_ci
1877db96d56Sopenharmony_ci/* Counts the total number of dots in seq's tokens */
1887db96d56Sopenharmony_ciint
1897db96d56Sopenharmony_ci_PyPegen_seq_count_dots(asdl_seq *seq)
1907db96d56Sopenharmony_ci{
1917db96d56Sopenharmony_ci    int number_of_dots = 0;
1927db96d56Sopenharmony_ci    for (Py_ssize_t i = 0, l = asdl_seq_LEN(seq); i < l; i++) {
1937db96d56Sopenharmony_ci        Token *current_expr = asdl_seq_GET_UNTYPED(seq, i);
1947db96d56Sopenharmony_ci        switch (current_expr->type) {
1957db96d56Sopenharmony_ci            case ELLIPSIS:
1967db96d56Sopenharmony_ci                number_of_dots += 3;
1977db96d56Sopenharmony_ci                break;
1987db96d56Sopenharmony_ci            case DOT:
1997db96d56Sopenharmony_ci                number_of_dots += 1;
2007db96d56Sopenharmony_ci                break;
2017db96d56Sopenharmony_ci            default:
2027db96d56Sopenharmony_ci                Py_UNREACHABLE();
2037db96d56Sopenharmony_ci        }
2047db96d56Sopenharmony_ci    }
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ci    return number_of_dots;
2077db96d56Sopenharmony_ci}
2087db96d56Sopenharmony_ci
2097db96d56Sopenharmony_ci/* Creates an alias with '*' as the identifier name */
2107db96d56Sopenharmony_cialias_ty
2117db96d56Sopenharmony_ci_PyPegen_alias_for_star(Parser *p, int lineno, int col_offset, int end_lineno,
2127db96d56Sopenharmony_ci                        int end_col_offset, PyArena *arena) {
2137db96d56Sopenharmony_ci    PyObject *str = PyUnicode_InternFromString("*");
2147db96d56Sopenharmony_ci    if (!str) {
2157db96d56Sopenharmony_ci        return NULL;
2167db96d56Sopenharmony_ci    }
2177db96d56Sopenharmony_ci    if (_PyArena_AddPyObject(p->arena, str) < 0) {
2187db96d56Sopenharmony_ci        Py_DECREF(str);
2197db96d56Sopenharmony_ci        return NULL;
2207db96d56Sopenharmony_ci    }
2217db96d56Sopenharmony_ci    return _PyAST_alias(str, NULL, lineno, col_offset, end_lineno, end_col_offset, arena);
2227db96d56Sopenharmony_ci}
2237db96d56Sopenharmony_ci
2247db96d56Sopenharmony_ci/* Creates a new asdl_seq* with the identifiers of all the names in seq */
2257db96d56Sopenharmony_ciasdl_identifier_seq *
2267db96d56Sopenharmony_ci_PyPegen_map_names_to_ids(Parser *p, asdl_expr_seq *seq)
2277db96d56Sopenharmony_ci{
2287db96d56Sopenharmony_ci    Py_ssize_t len = asdl_seq_LEN(seq);
2297db96d56Sopenharmony_ci    assert(len > 0);
2307db96d56Sopenharmony_ci
2317db96d56Sopenharmony_ci    asdl_identifier_seq *new_seq = _Py_asdl_identifier_seq_new(len, p->arena);
2327db96d56Sopenharmony_ci    if (!new_seq) {
2337db96d56Sopenharmony_ci        return NULL;
2347db96d56Sopenharmony_ci    }
2357db96d56Sopenharmony_ci    for (Py_ssize_t i = 0; i < len; i++) {
2367db96d56Sopenharmony_ci        expr_ty e = asdl_seq_GET(seq, i);
2377db96d56Sopenharmony_ci        asdl_seq_SET(new_seq, i, e->v.Name.id);
2387db96d56Sopenharmony_ci    }
2397db96d56Sopenharmony_ci    return new_seq;
2407db96d56Sopenharmony_ci}
2417db96d56Sopenharmony_ci
2427db96d56Sopenharmony_ci/* Constructs a CmpopExprPair */
2437db96d56Sopenharmony_ciCmpopExprPair *
2447db96d56Sopenharmony_ci_PyPegen_cmpop_expr_pair(Parser *p, cmpop_ty cmpop, expr_ty expr)
2457db96d56Sopenharmony_ci{
2467db96d56Sopenharmony_ci    assert(expr != NULL);
2477db96d56Sopenharmony_ci    CmpopExprPair *a = _PyArena_Malloc(p->arena, sizeof(CmpopExprPair));
2487db96d56Sopenharmony_ci    if (!a) {
2497db96d56Sopenharmony_ci        return NULL;
2507db96d56Sopenharmony_ci    }
2517db96d56Sopenharmony_ci    a->cmpop = cmpop;
2527db96d56Sopenharmony_ci    a->expr = expr;
2537db96d56Sopenharmony_ci    return a;
2547db96d56Sopenharmony_ci}
2557db96d56Sopenharmony_ci
2567db96d56Sopenharmony_ciasdl_int_seq *
2577db96d56Sopenharmony_ci_PyPegen_get_cmpops(Parser *p, asdl_seq *seq)
2587db96d56Sopenharmony_ci{
2597db96d56Sopenharmony_ci    Py_ssize_t len = asdl_seq_LEN(seq);
2607db96d56Sopenharmony_ci    assert(len > 0);
2617db96d56Sopenharmony_ci
2627db96d56Sopenharmony_ci    asdl_int_seq *new_seq = _Py_asdl_int_seq_new(len, p->arena);
2637db96d56Sopenharmony_ci    if (!new_seq) {
2647db96d56Sopenharmony_ci        return NULL;
2657db96d56Sopenharmony_ci    }
2667db96d56Sopenharmony_ci    for (Py_ssize_t i = 0; i < len; i++) {
2677db96d56Sopenharmony_ci        CmpopExprPair *pair = asdl_seq_GET_UNTYPED(seq, i);
2687db96d56Sopenharmony_ci        asdl_seq_SET(new_seq, i, pair->cmpop);
2697db96d56Sopenharmony_ci    }
2707db96d56Sopenharmony_ci    return new_seq;
2717db96d56Sopenharmony_ci}
2727db96d56Sopenharmony_ci
2737db96d56Sopenharmony_ciasdl_expr_seq *
2747db96d56Sopenharmony_ci_PyPegen_get_exprs(Parser *p, asdl_seq *seq)
2757db96d56Sopenharmony_ci{
2767db96d56Sopenharmony_ci    Py_ssize_t len = asdl_seq_LEN(seq);
2777db96d56Sopenharmony_ci    assert(len > 0);
2787db96d56Sopenharmony_ci
2797db96d56Sopenharmony_ci    asdl_expr_seq *new_seq = _Py_asdl_expr_seq_new(len, p->arena);
2807db96d56Sopenharmony_ci    if (!new_seq) {
2817db96d56Sopenharmony_ci        return NULL;
2827db96d56Sopenharmony_ci    }
2837db96d56Sopenharmony_ci    for (Py_ssize_t i = 0; i < len; i++) {
2847db96d56Sopenharmony_ci        CmpopExprPair *pair = asdl_seq_GET_UNTYPED(seq, i);
2857db96d56Sopenharmony_ci        asdl_seq_SET(new_seq, i, pair->expr);
2867db96d56Sopenharmony_ci    }
2877db96d56Sopenharmony_ci    return new_seq;
2887db96d56Sopenharmony_ci}
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_ci/* Creates an asdl_seq* where all the elements have been changed to have ctx as context */
2917db96d56Sopenharmony_cistatic asdl_expr_seq *
2927db96d56Sopenharmony_ci_set_seq_context(Parser *p, asdl_expr_seq *seq, expr_context_ty ctx)
2937db96d56Sopenharmony_ci{
2947db96d56Sopenharmony_ci    Py_ssize_t len = asdl_seq_LEN(seq);
2957db96d56Sopenharmony_ci    if (len == 0) {
2967db96d56Sopenharmony_ci        return NULL;
2977db96d56Sopenharmony_ci    }
2987db96d56Sopenharmony_ci
2997db96d56Sopenharmony_ci    asdl_expr_seq *new_seq = _Py_asdl_expr_seq_new(len, p->arena);
3007db96d56Sopenharmony_ci    if (!new_seq) {
3017db96d56Sopenharmony_ci        return NULL;
3027db96d56Sopenharmony_ci    }
3037db96d56Sopenharmony_ci    for (Py_ssize_t i = 0; i < len; i++) {
3047db96d56Sopenharmony_ci        expr_ty e = asdl_seq_GET(seq, i);
3057db96d56Sopenharmony_ci        asdl_seq_SET(new_seq, i, _PyPegen_set_expr_context(p, e, ctx));
3067db96d56Sopenharmony_ci    }
3077db96d56Sopenharmony_ci    return new_seq;
3087db96d56Sopenharmony_ci}
3097db96d56Sopenharmony_ci
3107db96d56Sopenharmony_cistatic expr_ty
3117db96d56Sopenharmony_ci_set_name_context(Parser *p, expr_ty e, expr_context_ty ctx)
3127db96d56Sopenharmony_ci{
3137db96d56Sopenharmony_ci    return _PyAST_Name(e->v.Name.id, ctx, EXTRA_EXPR(e, e));
3147db96d56Sopenharmony_ci}
3157db96d56Sopenharmony_ci
3167db96d56Sopenharmony_cistatic expr_ty
3177db96d56Sopenharmony_ci_set_tuple_context(Parser *p, expr_ty e, expr_context_ty ctx)
3187db96d56Sopenharmony_ci{
3197db96d56Sopenharmony_ci    return _PyAST_Tuple(
3207db96d56Sopenharmony_ci            _set_seq_context(p, e->v.Tuple.elts, ctx),
3217db96d56Sopenharmony_ci            ctx,
3227db96d56Sopenharmony_ci            EXTRA_EXPR(e, e));
3237db96d56Sopenharmony_ci}
3247db96d56Sopenharmony_ci
3257db96d56Sopenharmony_cistatic expr_ty
3267db96d56Sopenharmony_ci_set_list_context(Parser *p, expr_ty e, expr_context_ty ctx)
3277db96d56Sopenharmony_ci{
3287db96d56Sopenharmony_ci    return _PyAST_List(
3297db96d56Sopenharmony_ci            _set_seq_context(p, e->v.List.elts, ctx),
3307db96d56Sopenharmony_ci            ctx,
3317db96d56Sopenharmony_ci            EXTRA_EXPR(e, e));
3327db96d56Sopenharmony_ci}
3337db96d56Sopenharmony_ci
3347db96d56Sopenharmony_cistatic expr_ty
3357db96d56Sopenharmony_ci_set_subscript_context(Parser *p, expr_ty e, expr_context_ty ctx)
3367db96d56Sopenharmony_ci{
3377db96d56Sopenharmony_ci    return _PyAST_Subscript(e->v.Subscript.value, e->v.Subscript.slice,
3387db96d56Sopenharmony_ci                            ctx, EXTRA_EXPR(e, e));
3397db96d56Sopenharmony_ci}
3407db96d56Sopenharmony_ci
3417db96d56Sopenharmony_cistatic expr_ty
3427db96d56Sopenharmony_ci_set_attribute_context(Parser *p, expr_ty e, expr_context_ty ctx)
3437db96d56Sopenharmony_ci{
3447db96d56Sopenharmony_ci    return _PyAST_Attribute(e->v.Attribute.value, e->v.Attribute.attr,
3457db96d56Sopenharmony_ci                            ctx, EXTRA_EXPR(e, e));
3467db96d56Sopenharmony_ci}
3477db96d56Sopenharmony_ci
3487db96d56Sopenharmony_cistatic expr_ty
3497db96d56Sopenharmony_ci_set_starred_context(Parser *p, expr_ty e, expr_context_ty ctx)
3507db96d56Sopenharmony_ci{
3517db96d56Sopenharmony_ci    return _PyAST_Starred(_PyPegen_set_expr_context(p, e->v.Starred.value, ctx),
3527db96d56Sopenharmony_ci                          ctx, EXTRA_EXPR(e, e));
3537db96d56Sopenharmony_ci}
3547db96d56Sopenharmony_ci
3557db96d56Sopenharmony_ci/* Creates an `expr_ty` equivalent to `expr` but with `ctx` as context */
3567db96d56Sopenharmony_ciexpr_ty
3577db96d56Sopenharmony_ci_PyPegen_set_expr_context(Parser *p, expr_ty expr, expr_context_ty ctx)
3587db96d56Sopenharmony_ci{
3597db96d56Sopenharmony_ci    assert(expr != NULL);
3607db96d56Sopenharmony_ci
3617db96d56Sopenharmony_ci    expr_ty new = NULL;
3627db96d56Sopenharmony_ci    switch (expr->kind) {
3637db96d56Sopenharmony_ci        case Name_kind:
3647db96d56Sopenharmony_ci            new = _set_name_context(p, expr, ctx);
3657db96d56Sopenharmony_ci            break;
3667db96d56Sopenharmony_ci        case Tuple_kind:
3677db96d56Sopenharmony_ci            new = _set_tuple_context(p, expr, ctx);
3687db96d56Sopenharmony_ci            break;
3697db96d56Sopenharmony_ci        case List_kind:
3707db96d56Sopenharmony_ci            new = _set_list_context(p, expr, ctx);
3717db96d56Sopenharmony_ci            break;
3727db96d56Sopenharmony_ci        case Subscript_kind:
3737db96d56Sopenharmony_ci            new = _set_subscript_context(p, expr, ctx);
3747db96d56Sopenharmony_ci            break;
3757db96d56Sopenharmony_ci        case Attribute_kind:
3767db96d56Sopenharmony_ci            new = _set_attribute_context(p, expr, ctx);
3777db96d56Sopenharmony_ci            break;
3787db96d56Sopenharmony_ci        case Starred_kind:
3797db96d56Sopenharmony_ci            new = _set_starred_context(p, expr, ctx);
3807db96d56Sopenharmony_ci            break;
3817db96d56Sopenharmony_ci        default:
3827db96d56Sopenharmony_ci            new = expr;
3837db96d56Sopenharmony_ci    }
3847db96d56Sopenharmony_ci    return new;
3857db96d56Sopenharmony_ci}
3867db96d56Sopenharmony_ci
3877db96d56Sopenharmony_ci/* Constructs a KeyValuePair that is used when parsing a dict's key value pairs */
3887db96d56Sopenharmony_ciKeyValuePair *
3897db96d56Sopenharmony_ci_PyPegen_key_value_pair(Parser *p, expr_ty key, expr_ty value)
3907db96d56Sopenharmony_ci{
3917db96d56Sopenharmony_ci    KeyValuePair *a = _PyArena_Malloc(p->arena, sizeof(KeyValuePair));
3927db96d56Sopenharmony_ci    if (!a) {
3937db96d56Sopenharmony_ci        return NULL;
3947db96d56Sopenharmony_ci    }
3957db96d56Sopenharmony_ci    a->key = key;
3967db96d56Sopenharmony_ci    a->value = value;
3977db96d56Sopenharmony_ci    return a;
3987db96d56Sopenharmony_ci}
3997db96d56Sopenharmony_ci
4007db96d56Sopenharmony_ci/* Extracts all keys from an asdl_seq* of KeyValuePair*'s */
4017db96d56Sopenharmony_ciasdl_expr_seq *
4027db96d56Sopenharmony_ci_PyPegen_get_keys(Parser *p, asdl_seq *seq)
4037db96d56Sopenharmony_ci{
4047db96d56Sopenharmony_ci    Py_ssize_t len = asdl_seq_LEN(seq);
4057db96d56Sopenharmony_ci    asdl_expr_seq *new_seq = _Py_asdl_expr_seq_new(len, p->arena);
4067db96d56Sopenharmony_ci    if (!new_seq) {
4077db96d56Sopenharmony_ci        return NULL;
4087db96d56Sopenharmony_ci    }
4097db96d56Sopenharmony_ci    for (Py_ssize_t i = 0; i < len; i++) {
4107db96d56Sopenharmony_ci        KeyValuePair *pair = asdl_seq_GET_UNTYPED(seq, i);
4117db96d56Sopenharmony_ci        asdl_seq_SET(new_seq, i, pair->key);
4127db96d56Sopenharmony_ci    }
4137db96d56Sopenharmony_ci    return new_seq;
4147db96d56Sopenharmony_ci}
4157db96d56Sopenharmony_ci
4167db96d56Sopenharmony_ci/* Extracts all values from an asdl_seq* of KeyValuePair*'s */
4177db96d56Sopenharmony_ciasdl_expr_seq *
4187db96d56Sopenharmony_ci_PyPegen_get_values(Parser *p, asdl_seq *seq)
4197db96d56Sopenharmony_ci{
4207db96d56Sopenharmony_ci    Py_ssize_t len = asdl_seq_LEN(seq);
4217db96d56Sopenharmony_ci    asdl_expr_seq *new_seq = _Py_asdl_expr_seq_new(len, p->arena);
4227db96d56Sopenharmony_ci    if (!new_seq) {
4237db96d56Sopenharmony_ci        return NULL;
4247db96d56Sopenharmony_ci    }
4257db96d56Sopenharmony_ci    for (Py_ssize_t i = 0; i < len; i++) {
4267db96d56Sopenharmony_ci        KeyValuePair *pair = asdl_seq_GET_UNTYPED(seq, i);
4277db96d56Sopenharmony_ci        asdl_seq_SET(new_seq, i, pair->value);
4287db96d56Sopenharmony_ci    }
4297db96d56Sopenharmony_ci    return new_seq;
4307db96d56Sopenharmony_ci}
4317db96d56Sopenharmony_ci
4327db96d56Sopenharmony_ci/* Constructs a KeyPatternPair that is used when parsing mapping & class patterns */
4337db96d56Sopenharmony_ciKeyPatternPair *
4347db96d56Sopenharmony_ci_PyPegen_key_pattern_pair(Parser *p, expr_ty key, pattern_ty pattern)
4357db96d56Sopenharmony_ci{
4367db96d56Sopenharmony_ci    KeyPatternPair *a = _PyArena_Malloc(p->arena, sizeof(KeyPatternPair));
4377db96d56Sopenharmony_ci    if (!a) {
4387db96d56Sopenharmony_ci        return NULL;
4397db96d56Sopenharmony_ci    }
4407db96d56Sopenharmony_ci    a->key = key;
4417db96d56Sopenharmony_ci    a->pattern = pattern;
4427db96d56Sopenharmony_ci    return a;
4437db96d56Sopenharmony_ci}
4447db96d56Sopenharmony_ci
4457db96d56Sopenharmony_ci/* Extracts all keys from an asdl_seq* of KeyPatternPair*'s */
4467db96d56Sopenharmony_ciasdl_expr_seq *
4477db96d56Sopenharmony_ci_PyPegen_get_pattern_keys(Parser *p, asdl_seq *seq)
4487db96d56Sopenharmony_ci{
4497db96d56Sopenharmony_ci    Py_ssize_t len = asdl_seq_LEN(seq);
4507db96d56Sopenharmony_ci    asdl_expr_seq *new_seq = _Py_asdl_expr_seq_new(len, p->arena);
4517db96d56Sopenharmony_ci    if (!new_seq) {
4527db96d56Sopenharmony_ci        return NULL;
4537db96d56Sopenharmony_ci    }
4547db96d56Sopenharmony_ci    for (Py_ssize_t i = 0; i < len; i++) {
4557db96d56Sopenharmony_ci        KeyPatternPair *pair = asdl_seq_GET_UNTYPED(seq, i);
4567db96d56Sopenharmony_ci        asdl_seq_SET(new_seq, i, pair->key);
4577db96d56Sopenharmony_ci    }
4587db96d56Sopenharmony_ci    return new_seq;
4597db96d56Sopenharmony_ci}
4607db96d56Sopenharmony_ci
4617db96d56Sopenharmony_ci/* Extracts all patterns from an asdl_seq* of KeyPatternPair*'s */
4627db96d56Sopenharmony_ciasdl_pattern_seq *
4637db96d56Sopenharmony_ci_PyPegen_get_patterns(Parser *p, asdl_seq *seq)
4647db96d56Sopenharmony_ci{
4657db96d56Sopenharmony_ci    Py_ssize_t len = asdl_seq_LEN(seq);
4667db96d56Sopenharmony_ci    asdl_pattern_seq *new_seq = _Py_asdl_pattern_seq_new(len, p->arena);
4677db96d56Sopenharmony_ci    if (!new_seq) {
4687db96d56Sopenharmony_ci        return NULL;
4697db96d56Sopenharmony_ci    }
4707db96d56Sopenharmony_ci    for (Py_ssize_t i = 0; i < len; i++) {
4717db96d56Sopenharmony_ci        KeyPatternPair *pair = asdl_seq_GET_UNTYPED(seq, i);
4727db96d56Sopenharmony_ci        asdl_seq_SET(new_seq, i, pair->pattern);
4737db96d56Sopenharmony_ci    }
4747db96d56Sopenharmony_ci    return new_seq;
4757db96d56Sopenharmony_ci}
4767db96d56Sopenharmony_ci
4777db96d56Sopenharmony_ci/* Constructs a NameDefaultPair */
4787db96d56Sopenharmony_ciNameDefaultPair *
4797db96d56Sopenharmony_ci_PyPegen_name_default_pair(Parser *p, arg_ty arg, expr_ty value, Token *tc)
4807db96d56Sopenharmony_ci{
4817db96d56Sopenharmony_ci    NameDefaultPair *a = _PyArena_Malloc(p->arena, sizeof(NameDefaultPair));
4827db96d56Sopenharmony_ci    if (!a) {
4837db96d56Sopenharmony_ci        return NULL;
4847db96d56Sopenharmony_ci    }
4857db96d56Sopenharmony_ci    a->arg = _PyPegen_add_type_comment_to_arg(p, arg, tc);
4867db96d56Sopenharmony_ci    a->value = value;
4877db96d56Sopenharmony_ci    return a;
4887db96d56Sopenharmony_ci}
4897db96d56Sopenharmony_ci
4907db96d56Sopenharmony_ci/* Constructs a SlashWithDefault */
4917db96d56Sopenharmony_ciSlashWithDefault *
4927db96d56Sopenharmony_ci_PyPegen_slash_with_default(Parser *p, asdl_arg_seq *plain_names, asdl_seq *names_with_defaults)
4937db96d56Sopenharmony_ci{
4947db96d56Sopenharmony_ci    SlashWithDefault *a = _PyArena_Malloc(p->arena, sizeof(SlashWithDefault));
4957db96d56Sopenharmony_ci    if (!a) {
4967db96d56Sopenharmony_ci        return NULL;
4977db96d56Sopenharmony_ci    }
4987db96d56Sopenharmony_ci    a->plain_names = plain_names;
4997db96d56Sopenharmony_ci    a->names_with_defaults = names_with_defaults;
5007db96d56Sopenharmony_ci    return a;
5017db96d56Sopenharmony_ci}
5027db96d56Sopenharmony_ci
5037db96d56Sopenharmony_ci/* Constructs a StarEtc */
5047db96d56Sopenharmony_ciStarEtc *
5057db96d56Sopenharmony_ci_PyPegen_star_etc(Parser *p, arg_ty vararg, asdl_seq *kwonlyargs, arg_ty kwarg)
5067db96d56Sopenharmony_ci{
5077db96d56Sopenharmony_ci    StarEtc *a = _PyArena_Malloc(p->arena, sizeof(StarEtc));
5087db96d56Sopenharmony_ci    if (!a) {
5097db96d56Sopenharmony_ci        return NULL;
5107db96d56Sopenharmony_ci    }
5117db96d56Sopenharmony_ci    a->vararg = vararg;
5127db96d56Sopenharmony_ci    a->kwonlyargs = kwonlyargs;
5137db96d56Sopenharmony_ci    a->kwarg = kwarg;
5147db96d56Sopenharmony_ci    return a;
5157db96d56Sopenharmony_ci}
5167db96d56Sopenharmony_ci
5177db96d56Sopenharmony_ciasdl_seq *
5187db96d56Sopenharmony_ci_PyPegen_join_sequences(Parser *p, asdl_seq *a, asdl_seq *b)
5197db96d56Sopenharmony_ci{
5207db96d56Sopenharmony_ci    Py_ssize_t first_len = asdl_seq_LEN(a);
5217db96d56Sopenharmony_ci    Py_ssize_t second_len = asdl_seq_LEN(b);
5227db96d56Sopenharmony_ci    asdl_seq *new_seq = (asdl_seq*)_Py_asdl_generic_seq_new(first_len + second_len, p->arena);
5237db96d56Sopenharmony_ci    if (!new_seq) {
5247db96d56Sopenharmony_ci        return NULL;
5257db96d56Sopenharmony_ci    }
5267db96d56Sopenharmony_ci
5277db96d56Sopenharmony_ci    int k = 0;
5287db96d56Sopenharmony_ci    for (Py_ssize_t i = 0; i < first_len; i++) {
5297db96d56Sopenharmony_ci        asdl_seq_SET_UNTYPED(new_seq, k++, asdl_seq_GET_UNTYPED(a, i));
5307db96d56Sopenharmony_ci    }
5317db96d56Sopenharmony_ci    for (Py_ssize_t i = 0; i < second_len; i++) {
5327db96d56Sopenharmony_ci        asdl_seq_SET_UNTYPED(new_seq, k++, asdl_seq_GET_UNTYPED(b, i));
5337db96d56Sopenharmony_ci    }
5347db96d56Sopenharmony_ci
5357db96d56Sopenharmony_ci    return new_seq;
5367db96d56Sopenharmony_ci}
5377db96d56Sopenharmony_ci
5387db96d56Sopenharmony_cistatic asdl_arg_seq*
5397db96d56Sopenharmony_ci_get_names(Parser *p, asdl_seq *names_with_defaults)
5407db96d56Sopenharmony_ci{
5417db96d56Sopenharmony_ci    Py_ssize_t len = asdl_seq_LEN(names_with_defaults);
5427db96d56Sopenharmony_ci    asdl_arg_seq *seq = _Py_asdl_arg_seq_new(len, p->arena);
5437db96d56Sopenharmony_ci    if (!seq) {
5447db96d56Sopenharmony_ci        return NULL;
5457db96d56Sopenharmony_ci    }
5467db96d56Sopenharmony_ci    for (Py_ssize_t i = 0; i < len; i++) {
5477db96d56Sopenharmony_ci        NameDefaultPair *pair = asdl_seq_GET_UNTYPED(names_with_defaults, i);
5487db96d56Sopenharmony_ci        asdl_seq_SET(seq, i, pair->arg);
5497db96d56Sopenharmony_ci    }
5507db96d56Sopenharmony_ci    return seq;
5517db96d56Sopenharmony_ci}
5527db96d56Sopenharmony_ci
5537db96d56Sopenharmony_cistatic asdl_expr_seq *
5547db96d56Sopenharmony_ci_get_defaults(Parser *p, asdl_seq *names_with_defaults)
5557db96d56Sopenharmony_ci{
5567db96d56Sopenharmony_ci    Py_ssize_t len = asdl_seq_LEN(names_with_defaults);
5577db96d56Sopenharmony_ci    asdl_expr_seq *seq = _Py_asdl_expr_seq_new(len, p->arena);
5587db96d56Sopenharmony_ci    if (!seq) {
5597db96d56Sopenharmony_ci        return NULL;
5607db96d56Sopenharmony_ci    }
5617db96d56Sopenharmony_ci    for (Py_ssize_t i = 0; i < len; i++) {
5627db96d56Sopenharmony_ci        NameDefaultPair *pair = asdl_seq_GET_UNTYPED(names_with_defaults, i);
5637db96d56Sopenharmony_ci        asdl_seq_SET(seq, i, pair->value);
5647db96d56Sopenharmony_ci    }
5657db96d56Sopenharmony_ci    return seq;
5667db96d56Sopenharmony_ci}
5677db96d56Sopenharmony_ci
5687db96d56Sopenharmony_cistatic int
5697db96d56Sopenharmony_ci_make_posonlyargs(Parser *p,
5707db96d56Sopenharmony_ci                  asdl_arg_seq *slash_without_default,
5717db96d56Sopenharmony_ci                  SlashWithDefault *slash_with_default,
5727db96d56Sopenharmony_ci                  asdl_arg_seq **posonlyargs) {
5737db96d56Sopenharmony_ci    if (slash_without_default != NULL) {
5747db96d56Sopenharmony_ci        *posonlyargs = slash_without_default;
5757db96d56Sopenharmony_ci    }
5767db96d56Sopenharmony_ci    else if (slash_with_default != NULL) {
5777db96d56Sopenharmony_ci        asdl_arg_seq *slash_with_default_names =
5787db96d56Sopenharmony_ci                _get_names(p, slash_with_default->names_with_defaults);
5797db96d56Sopenharmony_ci        if (!slash_with_default_names) {
5807db96d56Sopenharmony_ci            return -1;
5817db96d56Sopenharmony_ci        }
5827db96d56Sopenharmony_ci        *posonlyargs = (asdl_arg_seq*)_PyPegen_join_sequences(
5837db96d56Sopenharmony_ci                p,
5847db96d56Sopenharmony_ci                (asdl_seq*)slash_with_default->plain_names,
5857db96d56Sopenharmony_ci                (asdl_seq*)slash_with_default_names);
5867db96d56Sopenharmony_ci    }
5877db96d56Sopenharmony_ci    else {
5887db96d56Sopenharmony_ci        *posonlyargs = _Py_asdl_arg_seq_new(0, p->arena);
5897db96d56Sopenharmony_ci    }
5907db96d56Sopenharmony_ci    return *posonlyargs == NULL ? -1 : 0;
5917db96d56Sopenharmony_ci}
5927db96d56Sopenharmony_ci
5937db96d56Sopenharmony_cistatic int
5947db96d56Sopenharmony_ci_make_posargs(Parser *p,
5957db96d56Sopenharmony_ci              asdl_arg_seq *plain_names,
5967db96d56Sopenharmony_ci              asdl_seq *names_with_default,
5977db96d56Sopenharmony_ci              asdl_arg_seq **posargs) {
5987db96d56Sopenharmony_ci    if (plain_names != NULL && names_with_default != NULL) {
5997db96d56Sopenharmony_ci        asdl_arg_seq *names_with_default_names = _get_names(p, names_with_default);
6007db96d56Sopenharmony_ci        if (!names_with_default_names) {
6017db96d56Sopenharmony_ci            return -1;
6027db96d56Sopenharmony_ci        }
6037db96d56Sopenharmony_ci        *posargs = (asdl_arg_seq*)_PyPegen_join_sequences(
6047db96d56Sopenharmony_ci                p,(asdl_seq*)plain_names, (asdl_seq*)names_with_default_names);
6057db96d56Sopenharmony_ci    }
6067db96d56Sopenharmony_ci    else if (plain_names == NULL && names_with_default != NULL) {
6077db96d56Sopenharmony_ci        *posargs = _get_names(p, names_with_default);
6087db96d56Sopenharmony_ci    }
6097db96d56Sopenharmony_ci    else if (plain_names != NULL && names_with_default == NULL) {
6107db96d56Sopenharmony_ci        *posargs = plain_names;
6117db96d56Sopenharmony_ci    }
6127db96d56Sopenharmony_ci    else {
6137db96d56Sopenharmony_ci        *posargs = _Py_asdl_arg_seq_new(0, p->arena);
6147db96d56Sopenharmony_ci    }
6157db96d56Sopenharmony_ci    return *posargs == NULL ? -1 : 0;
6167db96d56Sopenharmony_ci}
6177db96d56Sopenharmony_ci
6187db96d56Sopenharmony_cistatic int
6197db96d56Sopenharmony_ci_make_posdefaults(Parser *p,
6207db96d56Sopenharmony_ci                  SlashWithDefault *slash_with_default,
6217db96d56Sopenharmony_ci                  asdl_seq *names_with_default,
6227db96d56Sopenharmony_ci                  asdl_expr_seq **posdefaults) {
6237db96d56Sopenharmony_ci    if (slash_with_default != NULL && names_with_default != NULL) {
6247db96d56Sopenharmony_ci        asdl_expr_seq *slash_with_default_values =
6257db96d56Sopenharmony_ci                _get_defaults(p, slash_with_default->names_with_defaults);
6267db96d56Sopenharmony_ci        if (!slash_with_default_values) {
6277db96d56Sopenharmony_ci            return -1;
6287db96d56Sopenharmony_ci        }
6297db96d56Sopenharmony_ci        asdl_expr_seq *names_with_default_values = _get_defaults(p, names_with_default);
6307db96d56Sopenharmony_ci        if (!names_with_default_values) {
6317db96d56Sopenharmony_ci            return -1;
6327db96d56Sopenharmony_ci        }
6337db96d56Sopenharmony_ci        *posdefaults = (asdl_expr_seq*)_PyPegen_join_sequences(
6347db96d56Sopenharmony_ci                p,
6357db96d56Sopenharmony_ci                (asdl_seq*)slash_with_default_values,
6367db96d56Sopenharmony_ci                (asdl_seq*)names_with_default_values);
6377db96d56Sopenharmony_ci    }
6387db96d56Sopenharmony_ci    else if (slash_with_default == NULL && names_with_default != NULL) {
6397db96d56Sopenharmony_ci        *posdefaults = _get_defaults(p, names_with_default);
6407db96d56Sopenharmony_ci    }
6417db96d56Sopenharmony_ci    else if (slash_with_default != NULL && names_with_default == NULL) {
6427db96d56Sopenharmony_ci        *posdefaults = _get_defaults(p, slash_with_default->names_with_defaults);
6437db96d56Sopenharmony_ci    }
6447db96d56Sopenharmony_ci    else {
6457db96d56Sopenharmony_ci        *posdefaults = _Py_asdl_expr_seq_new(0, p->arena);
6467db96d56Sopenharmony_ci    }
6477db96d56Sopenharmony_ci    return *posdefaults == NULL ? -1 : 0;
6487db96d56Sopenharmony_ci}
6497db96d56Sopenharmony_ci
6507db96d56Sopenharmony_cistatic int
6517db96d56Sopenharmony_ci_make_kwargs(Parser *p, StarEtc *star_etc,
6527db96d56Sopenharmony_ci             asdl_arg_seq **kwonlyargs,
6537db96d56Sopenharmony_ci             asdl_expr_seq **kwdefaults) {
6547db96d56Sopenharmony_ci    if (star_etc != NULL && star_etc->kwonlyargs != NULL) {
6557db96d56Sopenharmony_ci        *kwonlyargs = _get_names(p, star_etc->kwonlyargs);
6567db96d56Sopenharmony_ci    }
6577db96d56Sopenharmony_ci    else {
6587db96d56Sopenharmony_ci        *kwonlyargs = _Py_asdl_arg_seq_new(0, p->arena);
6597db96d56Sopenharmony_ci    }
6607db96d56Sopenharmony_ci
6617db96d56Sopenharmony_ci    if (*kwonlyargs == NULL) {
6627db96d56Sopenharmony_ci        return -1;
6637db96d56Sopenharmony_ci    }
6647db96d56Sopenharmony_ci
6657db96d56Sopenharmony_ci    if (star_etc != NULL && star_etc->kwonlyargs != NULL) {
6667db96d56Sopenharmony_ci        *kwdefaults = _get_defaults(p, star_etc->kwonlyargs);
6677db96d56Sopenharmony_ci    }
6687db96d56Sopenharmony_ci    else {
6697db96d56Sopenharmony_ci        *kwdefaults = _Py_asdl_expr_seq_new(0, p->arena);
6707db96d56Sopenharmony_ci    }
6717db96d56Sopenharmony_ci
6727db96d56Sopenharmony_ci    if (*kwdefaults == NULL) {
6737db96d56Sopenharmony_ci        return -1;
6747db96d56Sopenharmony_ci    }
6757db96d56Sopenharmony_ci
6767db96d56Sopenharmony_ci    return 0;
6777db96d56Sopenharmony_ci}
6787db96d56Sopenharmony_ci
6797db96d56Sopenharmony_ci/* Constructs an arguments_ty object out of all the parsed constructs in the parameters rule */
6807db96d56Sopenharmony_ciarguments_ty
6817db96d56Sopenharmony_ci_PyPegen_make_arguments(Parser *p, asdl_arg_seq *slash_without_default,
6827db96d56Sopenharmony_ci                        SlashWithDefault *slash_with_default, asdl_arg_seq *plain_names,
6837db96d56Sopenharmony_ci                        asdl_seq *names_with_default, StarEtc *star_etc)
6847db96d56Sopenharmony_ci{
6857db96d56Sopenharmony_ci    asdl_arg_seq *posonlyargs;
6867db96d56Sopenharmony_ci    if (_make_posonlyargs(p, slash_without_default, slash_with_default, &posonlyargs) == -1) {
6877db96d56Sopenharmony_ci        return NULL;
6887db96d56Sopenharmony_ci    }
6897db96d56Sopenharmony_ci
6907db96d56Sopenharmony_ci    asdl_arg_seq *posargs;
6917db96d56Sopenharmony_ci    if (_make_posargs(p, plain_names, names_with_default, &posargs) == -1) {
6927db96d56Sopenharmony_ci        return NULL;
6937db96d56Sopenharmony_ci    }
6947db96d56Sopenharmony_ci
6957db96d56Sopenharmony_ci    asdl_expr_seq *posdefaults;
6967db96d56Sopenharmony_ci    if (_make_posdefaults(p,slash_with_default, names_with_default, &posdefaults) == -1) {
6977db96d56Sopenharmony_ci        return NULL;
6987db96d56Sopenharmony_ci    }
6997db96d56Sopenharmony_ci
7007db96d56Sopenharmony_ci    arg_ty vararg = NULL;
7017db96d56Sopenharmony_ci    if (star_etc != NULL && star_etc->vararg != NULL) {
7027db96d56Sopenharmony_ci        vararg = star_etc->vararg;
7037db96d56Sopenharmony_ci    }
7047db96d56Sopenharmony_ci
7057db96d56Sopenharmony_ci    asdl_arg_seq *kwonlyargs;
7067db96d56Sopenharmony_ci    asdl_expr_seq *kwdefaults;
7077db96d56Sopenharmony_ci    if (_make_kwargs(p, star_etc, &kwonlyargs, &kwdefaults) == -1) {
7087db96d56Sopenharmony_ci        return NULL;
7097db96d56Sopenharmony_ci    }
7107db96d56Sopenharmony_ci
7117db96d56Sopenharmony_ci    arg_ty kwarg = NULL;
7127db96d56Sopenharmony_ci    if (star_etc != NULL && star_etc->kwarg != NULL) {
7137db96d56Sopenharmony_ci        kwarg = star_etc->kwarg;
7147db96d56Sopenharmony_ci    }
7157db96d56Sopenharmony_ci
7167db96d56Sopenharmony_ci    return _PyAST_arguments(posonlyargs, posargs, vararg, kwonlyargs,
7177db96d56Sopenharmony_ci                            kwdefaults, kwarg, posdefaults, p->arena);
7187db96d56Sopenharmony_ci}
7197db96d56Sopenharmony_ci
7207db96d56Sopenharmony_ci
7217db96d56Sopenharmony_ci/* Constructs an empty arguments_ty object, that gets used when a function accepts no
7227db96d56Sopenharmony_ci * arguments. */
7237db96d56Sopenharmony_ciarguments_ty
7247db96d56Sopenharmony_ci_PyPegen_empty_arguments(Parser *p)
7257db96d56Sopenharmony_ci{
7267db96d56Sopenharmony_ci    asdl_arg_seq *posonlyargs = _Py_asdl_arg_seq_new(0, p->arena);
7277db96d56Sopenharmony_ci    if (!posonlyargs) {
7287db96d56Sopenharmony_ci        return NULL;
7297db96d56Sopenharmony_ci    }
7307db96d56Sopenharmony_ci    asdl_arg_seq *posargs = _Py_asdl_arg_seq_new(0, p->arena);
7317db96d56Sopenharmony_ci    if (!posargs) {
7327db96d56Sopenharmony_ci        return NULL;
7337db96d56Sopenharmony_ci    }
7347db96d56Sopenharmony_ci    asdl_expr_seq *posdefaults = _Py_asdl_expr_seq_new(0, p->arena);
7357db96d56Sopenharmony_ci    if (!posdefaults) {
7367db96d56Sopenharmony_ci        return NULL;
7377db96d56Sopenharmony_ci    }
7387db96d56Sopenharmony_ci    asdl_arg_seq *kwonlyargs = _Py_asdl_arg_seq_new(0, p->arena);
7397db96d56Sopenharmony_ci    if (!kwonlyargs) {
7407db96d56Sopenharmony_ci        return NULL;
7417db96d56Sopenharmony_ci    }
7427db96d56Sopenharmony_ci    asdl_expr_seq *kwdefaults = _Py_asdl_expr_seq_new(0, p->arena);
7437db96d56Sopenharmony_ci    if (!kwdefaults) {
7447db96d56Sopenharmony_ci        return NULL;
7457db96d56Sopenharmony_ci    }
7467db96d56Sopenharmony_ci
7477db96d56Sopenharmony_ci    return _PyAST_arguments(posonlyargs, posargs, NULL, kwonlyargs,
7487db96d56Sopenharmony_ci                            kwdefaults, NULL, posdefaults, p->arena);
7497db96d56Sopenharmony_ci}
7507db96d56Sopenharmony_ci
7517db96d56Sopenharmony_ci/* Encapsulates the value of an operator_ty into an AugOperator struct */
7527db96d56Sopenharmony_ciAugOperator *
7537db96d56Sopenharmony_ci_PyPegen_augoperator(Parser *p, operator_ty kind)
7547db96d56Sopenharmony_ci{
7557db96d56Sopenharmony_ci    AugOperator *a = _PyArena_Malloc(p->arena, sizeof(AugOperator));
7567db96d56Sopenharmony_ci    if (!a) {
7577db96d56Sopenharmony_ci        return NULL;
7587db96d56Sopenharmony_ci    }
7597db96d56Sopenharmony_ci    a->kind = kind;
7607db96d56Sopenharmony_ci    return a;
7617db96d56Sopenharmony_ci}
7627db96d56Sopenharmony_ci
7637db96d56Sopenharmony_ci/* Construct a FunctionDef equivalent to function_def, but with decorators */
7647db96d56Sopenharmony_cistmt_ty
7657db96d56Sopenharmony_ci_PyPegen_function_def_decorators(Parser *p, asdl_expr_seq *decorators, stmt_ty function_def)
7667db96d56Sopenharmony_ci{
7677db96d56Sopenharmony_ci    assert(function_def != NULL);
7687db96d56Sopenharmony_ci    if (function_def->kind == AsyncFunctionDef_kind) {
7697db96d56Sopenharmony_ci        return _PyAST_AsyncFunctionDef(
7707db96d56Sopenharmony_ci            function_def->v.FunctionDef.name, function_def->v.FunctionDef.args,
7717db96d56Sopenharmony_ci            function_def->v.FunctionDef.body, decorators, function_def->v.FunctionDef.returns,
7727db96d56Sopenharmony_ci            function_def->v.FunctionDef.type_comment, function_def->lineno,
7737db96d56Sopenharmony_ci            function_def->col_offset, function_def->end_lineno, function_def->end_col_offset,
7747db96d56Sopenharmony_ci            p->arena);
7757db96d56Sopenharmony_ci    }
7767db96d56Sopenharmony_ci
7777db96d56Sopenharmony_ci    return _PyAST_FunctionDef(
7787db96d56Sopenharmony_ci        function_def->v.FunctionDef.name, function_def->v.FunctionDef.args,
7797db96d56Sopenharmony_ci        function_def->v.FunctionDef.body, decorators,
7807db96d56Sopenharmony_ci        function_def->v.FunctionDef.returns,
7817db96d56Sopenharmony_ci        function_def->v.FunctionDef.type_comment, function_def->lineno,
7827db96d56Sopenharmony_ci        function_def->col_offset, function_def->end_lineno,
7837db96d56Sopenharmony_ci        function_def->end_col_offset, p->arena);
7847db96d56Sopenharmony_ci}
7857db96d56Sopenharmony_ci
7867db96d56Sopenharmony_ci/* Construct a ClassDef equivalent to class_def, but with decorators */
7877db96d56Sopenharmony_cistmt_ty
7887db96d56Sopenharmony_ci_PyPegen_class_def_decorators(Parser *p, asdl_expr_seq *decorators, stmt_ty class_def)
7897db96d56Sopenharmony_ci{
7907db96d56Sopenharmony_ci    assert(class_def != NULL);
7917db96d56Sopenharmony_ci    return _PyAST_ClassDef(
7927db96d56Sopenharmony_ci        class_def->v.ClassDef.name, class_def->v.ClassDef.bases,
7937db96d56Sopenharmony_ci        class_def->v.ClassDef.keywords, class_def->v.ClassDef.body, decorators,
7947db96d56Sopenharmony_ci        class_def->lineno, class_def->col_offset, class_def->end_lineno,
7957db96d56Sopenharmony_ci        class_def->end_col_offset, p->arena);
7967db96d56Sopenharmony_ci}
7977db96d56Sopenharmony_ci
7987db96d56Sopenharmony_ci/* Construct a KeywordOrStarred */
7997db96d56Sopenharmony_ciKeywordOrStarred *
8007db96d56Sopenharmony_ci_PyPegen_keyword_or_starred(Parser *p, void *element, int is_keyword)
8017db96d56Sopenharmony_ci{
8027db96d56Sopenharmony_ci    KeywordOrStarred *a = _PyArena_Malloc(p->arena, sizeof(KeywordOrStarred));
8037db96d56Sopenharmony_ci    if (!a) {
8047db96d56Sopenharmony_ci        return NULL;
8057db96d56Sopenharmony_ci    }
8067db96d56Sopenharmony_ci    a->element = element;
8077db96d56Sopenharmony_ci    a->is_keyword = is_keyword;
8087db96d56Sopenharmony_ci    return a;
8097db96d56Sopenharmony_ci}
8107db96d56Sopenharmony_ci
8117db96d56Sopenharmony_ci/* Get the number of starred expressions in an asdl_seq* of KeywordOrStarred*s */
8127db96d56Sopenharmony_cistatic int
8137db96d56Sopenharmony_ci_seq_number_of_starred_exprs(asdl_seq *seq)
8147db96d56Sopenharmony_ci{
8157db96d56Sopenharmony_ci    int n = 0;
8167db96d56Sopenharmony_ci    for (Py_ssize_t i = 0, l = asdl_seq_LEN(seq); i < l; i++) {
8177db96d56Sopenharmony_ci        KeywordOrStarred *k = asdl_seq_GET_UNTYPED(seq, i);
8187db96d56Sopenharmony_ci        if (!k->is_keyword) {
8197db96d56Sopenharmony_ci            n++;
8207db96d56Sopenharmony_ci        }
8217db96d56Sopenharmony_ci    }
8227db96d56Sopenharmony_ci    return n;
8237db96d56Sopenharmony_ci}
8247db96d56Sopenharmony_ci
8257db96d56Sopenharmony_ci/* Extract the starred expressions of an asdl_seq* of KeywordOrStarred*s */
8267db96d56Sopenharmony_ciasdl_expr_seq *
8277db96d56Sopenharmony_ci_PyPegen_seq_extract_starred_exprs(Parser *p, asdl_seq *kwargs)
8287db96d56Sopenharmony_ci{
8297db96d56Sopenharmony_ci    int new_len = _seq_number_of_starred_exprs(kwargs);
8307db96d56Sopenharmony_ci    if (new_len == 0) {
8317db96d56Sopenharmony_ci        return NULL;
8327db96d56Sopenharmony_ci    }
8337db96d56Sopenharmony_ci    asdl_expr_seq *new_seq = _Py_asdl_expr_seq_new(new_len, p->arena);
8347db96d56Sopenharmony_ci    if (!new_seq) {
8357db96d56Sopenharmony_ci        return NULL;
8367db96d56Sopenharmony_ci    }
8377db96d56Sopenharmony_ci
8387db96d56Sopenharmony_ci    int idx = 0;
8397db96d56Sopenharmony_ci    for (Py_ssize_t i = 0, len = asdl_seq_LEN(kwargs); i < len; i++) {
8407db96d56Sopenharmony_ci        KeywordOrStarred *k = asdl_seq_GET_UNTYPED(kwargs, i);
8417db96d56Sopenharmony_ci        if (!k->is_keyword) {
8427db96d56Sopenharmony_ci            asdl_seq_SET(new_seq, idx++, k->element);
8437db96d56Sopenharmony_ci        }
8447db96d56Sopenharmony_ci    }
8457db96d56Sopenharmony_ci    return new_seq;
8467db96d56Sopenharmony_ci}
8477db96d56Sopenharmony_ci
8487db96d56Sopenharmony_ci/* Return a new asdl_seq* with only the keywords in kwargs */
8497db96d56Sopenharmony_ciasdl_keyword_seq*
8507db96d56Sopenharmony_ci_PyPegen_seq_delete_starred_exprs(Parser *p, asdl_seq *kwargs)
8517db96d56Sopenharmony_ci{
8527db96d56Sopenharmony_ci    Py_ssize_t len = asdl_seq_LEN(kwargs);
8537db96d56Sopenharmony_ci    Py_ssize_t new_len = len - _seq_number_of_starred_exprs(kwargs);
8547db96d56Sopenharmony_ci    if (new_len == 0) {
8557db96d56Sopenharmony_ci        return NULL;
8567db96d56Sopenharmony_ci    }
8577db96d56Sopenharmony_ci    asdl_keyword_seq *new_seq = _Py_asdl_keyword_seq_new(new_len, p->arena);
8587db96d56Sopenharmony_ci    if (!new_seq) {
8597db96d56Sopenharmony_ci        return NULL;
8607db96d56Sopenharmony_ci    }
8617db96d56Sopenharmony_ci
8627db96d56Sopenharmony_ci    int idx = 0;
8637db96d56Sopenharmony_ci    for (Py_ssize_t i = 0; i < len; i++) {
8647db96d56Sopenharmony_ci        KeywordOrStarred *k = asdl_seq_GET_UNTYPED(kwargs, i);
8657db96d56Sopenharmony_ci        if (k->is_keyword) {
8667db96d56Sopenharmony_ci            asdl_seq_SET(new_seq, idx++, k->element);
8677db96d56Sopenharmony_ci        }
8687db96d56Sopenharmony_ci    }
8697db96d56Sopenharmony_ci    return new_seq;
8707db96d56Sopenharmony_ci}
8717db96d56Sopenharmony_ci
8727db96d56Sopenharmony_ciexpr_ty
8737db96d56Sopenharmony_ci_PyPegen_concatenate_strings(Parser *p, asdl_seq *strings)
8747db96d56Sopenharmony_ci{
8757db96d56Sopenharmony_ci    Py_ssize_t len = asdl_seq_LEN(strings);
8767db96d56Sopenharmony_ci    assert(len > 0);
8777db96d56Sopenharmony_ci
8787db96d56Sopenharmony_ci    Token *first = asdl_seq_GET_UNTYPED(strings, 0);
8797db96d56Sopenharmony_ci    Token *last = asdl_seq_GET_UNTYPED(strings, len - 1);
8807db96d56Sopenharmony_ci
8817db96d56Sopenharmony_ci    int bytesmode = 0;
8827db96d56Sopenharmony_ci    PyObject *bytes_str = NULL;
8837db96d56Sopenharmony_ci
8847db96d56Sopenharmony_ci    FstringParser state;
8857db96d56Sopenharmony_ci    _PyPegen_FstringParser_Init(&state);
8867db96d56Sopenharmony_ci
8877db96d56Sopenharmony_ci    for (Py_ssize_t i = 0; i < len; i++) {
8887db96d56Sopenharmony_ci        Token *t = asdl_seq_GET_UNTYPED(strings, i);
8897db96d56Sopenharmony_ci
8907db96d56Sopenharmony_ci        int this_bytesmode;
8917db96d56Sopenharmony_ci        int this_rawmode;
8927db96d56Sopenharmony_ci        PyObject *s;
8937db96d56Sopenharmony_ci        const char *fstr;
8947db96d56Sopenharmony_ci        Py_ssize_t fstrlen = -1;
8957db96d56Sopenharmony_ci
8967db96d56Sopenharmony_ci        if (_PyPegen_parsestr(p, &this_bytesmode, &this_rawmode, &s, &fstr, &fstrlen, t) != 0) {
8977db96d56Sopenharmony_ci            goto error;
8987db96d56Sopenharmony_ci        }
8997db96d56Sopenharmony_ci
9007db96d56Sopenharmony_ci        /* Check that we are not mixing bytes with unicode. */
9017db96d56Sopenharmony_ci        if (i != 0 && bytesmode != this_bytesmode) {
9027db96d56Sopenharmony_ci            RAISE_SYNTAX_ERROR("cannot mix bytes and nonbytes literals");
9037db96d56Sopenharmony_ci            Py_XDECREF(s);
9047db96d56Sopenharmony_ci            goto error;
9057db96d56Sopenharmony_ci        }
9067db96d56Sopenharmony_ci        bytesmode = this_bytesmode;
9077db96d56Sopenharmony_ci
9087db96d56Sopenharmony_ci        if (fstr != NULL) {
9097db96d56Sopenharmony_ci            assert(s == NULL && !bytesmode);
9107db96d56Sopenharmony_ci
9117db96d56Sopenharmony_ci            int result = _PyPegen_FstringParser_ConcatFstring(p, &state, &fstr, fstr + fstrlen,
9127db96d56Sopenharmony_ci                                                     this_rawmode, 0, first, t, last);
9137db96d56Sopenharmony_ci            if (result < 0) {
9147db96d56Sopenharmony_ci                goto error;
9157db96d56Sopenharmony_ci            }
9167db96d56Sopenharmony_ci        }
9177db96d56Sopenharmony_ci        else {
9187db96d56Sopenharmony_ci            /* String or byte string. */
9197db96d56Sopenharmony_ci            assert(s != NULL && fstr == NULL);
9207db96d56Sopenharmony_ci            assert(bytesmode ? PyBytes_CheckExact(s) : PyUnicode_CheckExact(s));
9217db96d56Sopenharmony_ci
9227db96d56Sopenharmony_ci            if (bytesmode) {
9237db96d56Sopenharmony_ci                if (i == 0) {
9247db96d56Sopenharmony_ci                    bytes_str = s;
9257db96d56Sopenharmony_ci                }
9267db96d56Sopenharmony_ci                else {
9277db96d56Sopenharmony_ci                    PyBytes_ConcatAndDel(&bytes_str, s);
9287db96d56Sopenharmony_ci                    if (!bytes_str) {
9297db96d56Sopenharmony_ci                        goto error;
9307db96d56Sopenharmony_ci                    }
9317db96d56Sopenharmony_ci                }
9327db96d56Sopenharmony_ci            }
9337db96d56Sopenharmony_ci            else {
9347db96d56Sopenharmony_ci                /* This is a regular string. Concatenate it. */
9357db96d56Sopenharmony_ci                if (_PyPegen_FstringParser_ConcatAndDel(&state, s) < 0) {
9367db96d56Sopenharmony_ci                    goto error;
9377db96d56Sopenharmony_ci                }
9387db96d56Sopenharmony_ci            }
9397db96d56Sopenharmony_ci        }
9407db96d56Sopenharmony_ci    }
9417db96d56Sopenharmony_ci
9427db96d56Sopenharmony_ci    if (bytesmode) {
9437db96d56Sopenharmony_ci        if (_PyArena_AddPyObject(p->arena, bytes_str) < 0) {
9447db96d56Sopenharmony_ci            goto error;
9457db96d56Sopenharmony_ci        }
9467db96d56Sopenharmony_ci        return _PyAST_Constant(bytes_str, NULL, first->lineno,
9477db96d56Sopenharmony_ci                               first->col_offset, last->end_lineno,
9487db96d56Sopenharmony_ci                               last->end_col_offset, p->arena);
9497db96d56Sopenharmony_ci    }
9507db96d56Sopenharmony_ci
9517db96d56Sopenharmony_ci    return _PyPegen_FstringParser_Finish(p, &state, first, last);
9527db96d56Sopenharmony_ci
9537db96d56Sopenharmony_cierror:
9547db96d56Sopenharmony_ci    Py_XDECREF(bytes_str);
9557db96d56Sopenharmony_ci    _PyPegen_FstringParser_Dealloc(&state);
9567db96d56Sopenharmony_ci    if (PyErr_Occurred()) {
9577db96d56Sopenharmony_ci        _Pypegen_raise_decode_error(p);
9587db96d56Sopenharmony_ci    }
9597db96d56Sopenharmony_ci    return NULL;
9607db96d56Sopenharmony_ci}
9617db96d56Sopenharmony_ci
9627db96d56Sopenharmony_ciexpr_ty
9637db96d56Sopenharmony_ci_PyPegen_ensure_imaginary(Parser *p, expr_ty exp)
9647db96d56Sopenharmony_ci{
9657db96d56Sopenharmony_ci    if (exp->kind != Constant_kind || !PyComplex_CheckExact(exp->v.Constant.value)) {
9667db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(exp, "imaginary number required in complex literal");
9677db96d56Sopenharmony_ci        return NULL;
9687db96d56Sopenharmony_ci    }
9697db96d56Sopenharmony_ci    return exp;
9707db96d56Sopenharmony_ci}
9717db96d56Sopenharmony_ci
9727db96d56Sopenharmony_ciexpr_ty
9737db96d56Sopenharmony_ci_PyPegen_ensure_real(Parser *p, expr_ty exp)
9747db96d56Sopenharmony_ci{
9757db96d56Sopenharmony_ci    if (exp->kind != Constant_kind || PyComplex_CheckExact(exp->v.Constant.value)) {
9767db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR_KNOWN_LOCATION(exp, "real number required in complex literal");
9777db96d56Sopenharmony_ci        return NULL;
9787db96d56Sopenharmony_ci    }
9797db96d56Sopenharmony_ci    return exp;
9807db96d56Sopenharmony_ci}
9817db96d56Sopenharmony_ci
9827db96d56Sopenharmony_cimod_ty
9837db96d56Sopenharmony_ci_PyPegen_make_module(Parser *p, asdl_stmt_seq *a) {
9847db96d56Sopenharmony_ci    asdl_type_ignore_seq *type_ignores = NULL;
9857db96d56Sopenharmony_ci    Py_ssize_t num = p->type_ignore_comments.num_items;
9867db96d56Sopenharmony_ci    if (num > 0) {
9877db96d56Sopenharmony_ci        // Turn the raw (comment, lineno) pairs into TypeIgnore objects in the arena
9887db96d56Sopenharmony_ci        type_ignores = _Py_asdl_type_ignore_seq_new(num, p->arena);
9897db96d56Sopenharmony_ci        if (type_ignores == NULL) {
9907db96d56Sopenharmony_ci            return NULL;
9917db96d56Sopenharmony_ci        }
9927db96d56Sopenharmony_ci        for (int i = 0; i < num; i++) {
9937db96d56Sopenharmony_ci            PyObject *tag = _PyPegen_new_type_comment(p, p->type_ignore_comments.items[i].comment);
9947db96d56Sopenharmony_ci            if (tag == NULL) {
9957db96d56Sopenharmony_ci                return NULL;
9967db96d56Sopenharmony_ci            }
9977db96d56Sopenharmony_ci            type_ignore_ty ti = _PyAST_TypeIgnore(p->type_ignore_comments.items[i].lineno,
9987db96d56Sopenharmony_ci                                                  tag, p->arena);
9997db96d56Sopenharmony_ci            if (ti == NULL) {
10007db96d56Sopenharmony_ci                return NULL;
10017db96d56Sopenharmony_ci            }
10027db96d56Sopenharmony_ci            asdl_seq_SET(type_ignores, i, ti);
10037db96d56Sopenharmony_ci        }
10047db96d56Sopenharmony_ci    }
10057db96d56Sopenharmony_ci    return _PyAST_Module(a, type_ignores, p->arena);
10067db96d56Sopenharmony_ci}
10077db96d56Sopenharmony_ci
10087db96d56Sopenharmony_ciPyObject *
10097db96d56Sopenharmony_ci_PyPegen_new_type_comment(Parser *p, const char *s)
10107db96d56Sopenharmony_ci{
10117db96d56Sopenharmony_ci    PyObject *res = PyUnicode_DecodeUTF8(s, strlen(s), NULL);
10127db96d56Sopenharmony_ci    if (res == NULL) {
10137db96d56Sopenharmony_ci        return NULL;
10147db96d56Sopenharmony_ci    }
10157db96d56Sopenharmony_ci    if (_PyArena_AddPyObject(p->arena, res) < 0) {
10167db96d56Sopenharmony_ci        Py_DECREF(res);
10177db96d56Sopenharmony_ci        return NULL;
10187db96d56Sopenharmony_ci    }
10197db96d56Sopenharmony_ci    return res;
10207db96d56Sopenharmony_ci}
10217db96d56Sopenharmony_ci
10227db96d56Sopenharmony_ciarg_ty
10237db96d56Sopenharmony_ci_PyPegen_add_type_comment_to_arg(Parser *p, arg_ty a, Token *tc)
10247db96d56Sopenharmony_ci{
10257db96d56Sopenharmony_ci    if (tc == NULL) {
10267db96d56Sopenharmony_ci        return a;
10277db96d56Sopenharmony_ci    }
10287db96d56Sopenharmony_ci    const char *bytes = PyBytes_AsString(tc->bytes);
10297db96d56Sopenharmony_ci    if (bytes == NULL) {
10307db96d56Sopenharmony_ci        return NULL;
10317db96d56Sopenharmony_ci    }
10327db96d56Sopenharmony_ci    PyObject *tco = _PyPegen_new_type_comment(p, bytes);
10337db96d56Sopenharmony_ci    if (tco == NULL) {
10347db96d56Sopenharmony_ci        return NULL;
10357db96d56Sopenharmony_ci    }
10367db96d56Sopenharmony_ci    return _PyAST_arg(a->arg, a->annotation, tco,
10377db96d56Sopenharmony_ci                      a->lineno, a->col_offset, a->end_lineno, a->end_col_offset,
10387db96d56Sopenharmony_ci                      p->arena);
10397db96d56Sopenharmony_ci}
10407db96d56Sopenharmony_ci
10417db96d56Sopenharmony_ci/* Checks if the NOTEQUAL token is valid given the current parser flags
10427db96d56Sopenharmony_ci0 indicates success and nonzero indicates failure (an exception may be set) */
10437db96d56Sopenharmony_ciint
10447db96d56Sopenharmony_ci_PyPegen_check_barry_as_flufl(Parser *p, Token* t) {
10457db96d56Sopenharmony_ci    assert(t->bytes != NULL);
10467db96d56Sopenharmony_ci    assert(t->type == NOTEQUAL);
10477db96d56Sopenharmony_ci
10487db96d56Sopenharmony_ci    const char* tok_str = PyBytes_AS_STRING(t->bytes);
10497db96d56Sopenharmony_ci    if (p->flags & PyPARSE_BARRY_AS_BDFL && strcmp(tok_str, "<>") != 0) {
10507db96d56Sopenharmony_ci        RAISE_SYNTAX_ERROR("with Barry as BDFL, use '<>' instead of '!='");
10517db96d56Sopenharmony_ci        return -1;
10527db96d56Sopenharmony_ci    }
10537db96d56Sopenharmony_ci    if (!(p->flags & PyPARSE_BARRY_AS_BDFL)) {
10547db96d56Sopenharmony_ci        return strcmp(tok_str, "!=");
10557db96d56Sopenharmony_ci    }
10567db96d56Sopenharmony_ci    return 0;
10577db96d56Sopenharmony_ci}
10587db96d56Sopenharmony_ci
10597db96d56Sopenharmony_ciint
10607db96d56Sopenharmony_ci_PyPegen_check_legacy_stmt(Parser *p, expr_ty name) {
10617db96d56Sopenharmony_ci    if (name->kind != Name_kind) {
10627db96d56Sopenharmony_ci        return 0;
10637db96d56Sopenharmony_ci    }
10647db96d56Sopenharmony_ci    const char* candidates[2] = {"print", "exec"};
10657db96d56Sopenharmony_ci    for (int i=0; i<2; i++) {
10667db96d56Sopenharmony_ci        if (PyUnicode_CompareWithASCIIString(name->v.Name.id, candidates[i]) == 0) {
10677db96d56Sopenharmony_ci            return 1;
10687db96d56Sopenharmony_ci        }
10697db96d56Sopenharmony_ci    }
10707db96d56Sopenharmony_ci    return 0;
10717db96d56Sopenharmony_ci}
10727db96d56Sopenharmony_ci
10737db96d56Sopenharmony_ciconst char *
10747db96d56Sopenharmony_ci_PyPegen_get_expr_name(expr_ty e)
10757db96d56Sopenharmony_ci{
10767db96d56Sopenharmony_ci    assert(e != NULL);
10777db96d56Sopenharmony_ci    switch (e->kind) {
10787db96d56Sopenharmony_ci        case Attribute_kind:
10797db96d56Sopenharmony_ci            return "attribute";
10807db96d56Sopenharmony_ci        case Subscript_kind:
10817db96d56Sopenharmony_ci            return "subscript";
10827db96d56Sopenharmony_ci        case Starred_kind:
10837db96d56Sopenharmony_ci            return "starred";
10847db96d56Sopenharmony_ci        case Name_kind:
10857db96d56Sopenharmony_ci            return "name";
10867db96d56Sopenharmony_ci        case List_kind:
10877db96d56Sopenharmony_ci            return "list";
10887db96d56Sopenharmony_ci        case Tuple_kind:
10897db96d56Sopenharmony_ci            return "tuple";
10907db96d56Sopenharmony_ci        case Lambda_kind:
10917db96d56Sopenharmony_ci            return "lambda";
10927db96d56Sopenharmony_ci        case Call_kind:
10937db96d56Sopenharmony_ci            return "function call";
10947db96d56Sopenharmony_ci        case BoolOp_kind:
10957db96d56Sopenharmony_ci        case BinOp_kind:
10967db96d56Sopenharmony_ci        case UnaryOp_kind:
10977db96d56Sopenharmony_ci            return "expression";
10987db96d56Sopenharmony_ci        case GeneratorExp_kind:
10997db96d56Sopenharmony_ci            return "generator expression";
11007db96d56Sopenharmony_ci        case Yield_kind:
11017db96d56Sopenharmony_ci        case YieldFrom_kind:
11027db96d56Sopenharmony_ci            return "yield expression";
11037db96d56Sopenharmony_ci        case Await_kind:
11047db96d56Sopenharmony_ci            return "await expression";
11057db96d56Sopenharmony_ci        case ListComp_kind:
11067db96d56Sopenharmony_ci            return "list comprehension";
11077db96d56Sopenharmony_ci        case SetComp_kind:
11087db96d56Sopenharmony_ci            return "set comprehension";
11097db96d56Sopenharmony_ci        case DictComp_kind:
11107db96d56Sopenharmony_ci            return "dict comprehension";
11117db96d56Sopenharmony_ci        case Dict_kind:
11127db96d56Sopenharmony_ci            return "dict literal";
11137db96d56Sopenharmony_ci        case Set_kind:
11147db96d56Sopenharmony_ci            return "set display";
11157db96d56Sopenharmony_ci        case JoinedStr_kind:
11167db96d56Sopenharmony_ci        case FormattedValue_kind:
11177db96d56Sopenharmony_ci            return "f-string expression";
11187db96d56Sopenharmony_ci        case Constant_kind: {
11197db96d56Sopenharmony_ci            PyObject *value = e->v.Constant.value;
11207db96d56Sopenharmony_ci            if (value == Py_None) {
11217db96d56Sopenharmony_ci                return "None";
11227db96d56Sopenharmony_ci            }
11237db96d56Sopenharmony_ci            if (value == Py_False) {
11247db96d56Sopenharmony_ci                return "False";
11257db96d56Sopenharmony_ci            }
11267db96d56Sopenharmony_ci            if (value == Py_True) {
11277db96d56Sopenharmony_ci                return "True";
11287db96d56Sopenharmony_ci            }
11297db96d56Sopenharmony_ci            if (value == Py_Ellipsis) {
11307db96d56Sopenharmony_ci                return "ellipsis";
11317db96d56Sopenharmony_ci            }
11327db96d56Sopenharmony_ci            return "literal";
11337db96d56Sopenharmony_ci        }
11347db96d56Sopenharmony_ci        case Compare_kind:
11357db96d56Sopenharmony_ci            return "comparison";
11367db96d56Sopenharmony_ci        case IfExp_kind:
11377db96d56Sopenharmony_ci            return "conditional expression";
11387db96d56Sopenharmony_ci        case NamedExpr_kind:
11397db96d56Sopenharmony_ci            return "named expression";
11407db96d56Sopenharmony_ci        default:
11417db96d56Sopenharmony_ci            PyErr_Format(PyExc_SystemError,
11427db96d56Sopenharmony_ci                         "unexpected expression in assignment %d (line %d)",
11437db96d56Sopenharmony_ci                         e->kind, e->lineno);
11447db96d56Sopenharmony_ci            return NULL;
11457db96d56Sopenharmony_ci    }
11467db96d56Sopenharmony_ci}
11477db96d56Sopenharmony_ci
11487db96d56Sopenharmony_ciexpr_ty
11497db96d56Sopenharmony_ci_PyPegen_get_last_comprehension_item(comprehension_ty comprehension) {
11507db96d56Sopenharmony_ci    if (comprehension->ifs == NULL || asdl_seq_LEN(comprehension->ifs) == 0) {
11517db96d56Sopenharmony_ci        return comprehension->iter;
11527db96d56Sopenharmony_ci    }
11537db96d56Sopenharmony_ci    return PyPegen_last_item(comprehension->ifs, expr_ty);
11547db96d56Sopenharmony_ci}
11557db96d56Sopenharmony_ci
11567db96d56Sopenharmony_ciexpr_ty _PyPegen_collect_call_seqs(Parser *p, asdl_expr_seq *a, asdl_seq *b,
11577db96d56Sopenharmony_ci                     int lineno, int col_offset, int end_lineno,
11587db96d56Sopenharmony_ci                     int end_col_offset, PyArena *arena) {
11597db96d56Sopenharmony_ci    Py_ssize_t args_len = asdl_seq_LEN(a);
11607db96d56Sopenharmony_ci    Py_ssize_t total_len = args_len;
11617db96d56Sopenharmony_ci
11627db96d56Sopenharmony_ci    if (b == NULL) {
11637db96d56Sopenharmony_ci        return _PyAST_Call(_PyPegen_dummy_name(p), a, NULL, lineno, col_offset,
11647db96d56Sopenharmony_ci                        end_lineno, end_col_offset, arena);
11657db96d56Sopenharmony_ci
11667db96d56Sopenharmony_ci    }
11677db96d56Sopenharmony_ci
11687db96d56Sopenharmony_ci    asdl_expr_seq *starreds = _PyPegen_seq_extract_starred_exprs(p, b);
11697db96d56Sopenharmony_ci    asdl_keyword_seq *keywords = _PyPegen_seq_delete_starred_exprs(p, b);
11707db96d56Sopenharmony_ci
11717db96d56Sopenharmony_ci    if (starreds) {
11727db96d56Sopenharmony_ci        total_len += asdl_seq_LEN(starreds);
11737db96d56Sopenharmony_ci    }
11747db96d56Sopenharmony_ci
11757db96d56Sopenharmony_ci    asdl_expr_seq *args = _Py_asdl_expr_seq_new(total_len, arena);
11767db96d56Sopenharmony_ci
11777db96d56Sopenharmony_ci    Py_ssize_t i = 0;
11787db96d56Sopenharmony_ci    for (i = 0; i < args_len; i++) {
11797db96d56Sopenharmony_ci        asdl_seq_SET(args, i, asdl_seq_GET(a, i));
11807db96d56Sopenharmony_ci    }
11817db96d56Sopenharmony_ci    for (; i < total_len; i++) {
11827db96d56Sopenharmony_ci        asdl_seq_SET(args, i, asdl_seq_GET(starreds, i - args_len));
11837db96d56Sopenharmony_ci    }
11847db96d56Sopenharmony_ci
11857db96d56Sopenharmony_ci    return _PyAST_Call(_PyPegen_dummy_name(p), args, keywords, lineno,
11867db96d56Sopenharmony_ci                       col_offset, end_lineno, end_col_offset, arena);
11877db96d56Sopenharmony_ci}
11887db96d56Sopenharmony_ci
11897db96d56Sopenharmony_ci// AST Error reporting helpers
11907db96d56Sopenharmony_ci
11917db96d56Sopenharmony_ciexpr_ty
11927db96d56Sopenharmony_ci_PyPegen_get_invalid_target(expr_ty e, TARGETS_TYPE targets_type)
11937db96d56Sopenharmony_ci{
11947db96d56Sopenharmony_ci    if (e == NULL) {
11957db96d56Sopenharmony_ci        return NULL;
11967db96d56Sopenharmony_ci    }
11977db96d56Sopenharmony_ci
11987db96d56Sopenharmony_ci#define VISIT_CONTAINER(CONTAINER, TYPE) do { \
11997db96d56Sopenharmony_ci        Py_ssize_t len = asdl_seq_LEN((CONTAINER)->v.TYPE.elts);\
12007db96d56Sopenharmony_ci        for (Py_ssize_t i = 0; i < len; i++) {\
12017db96d56Sopenharmony_ci            expr_ty other = asdl_seq_GET((CONTAINER)->v.TYPE.elts, i);\
12027db96d56Sopenharmony_ci            expr_ty child = _PyPegen_get_invalid_target(other, targets_type);\
12037db96d56Sopenharmony_ci            if (child != NULL) {\
12047db96d56Sopenharmony_ci                return child;\
12057db96d56Sopenharmony_ci            }\
12067db96d56Sopenharmony_ci        }\
12077db96d56Sopenharmony_ci    } while (0)
12087db96d56Sopenharmony_ci
12097db96d56Sopenharmony_ci    // We only need to visit List and Tuple nodes recursively as those
12107db96d56Sopenharmony_ci    // are the only ones that can contain valid names in targets when
12117db96d56Sopenharmony_ci    // they are parsed as expressions. Any other kind of expression
12127db96d56Sopenharmony_ci    // that is a container (like Sets or Dicts) is directly invalid and
12137db96d56Sopenharmony_ci    // we don't need to visit it recursively.
12147db96d56Sopenharmony_ci
12157db96d56Sopenharmony_ci    switch (e->kind) {
12167db96d56Sopenharmony_ci        case List_kind:
12177db96d56Sopenharmony_ci            VISIT_CONTAINER(e, List);
12187db96d56Sopenharmony_ci            return NULL;
12197db96d56Sopenharmony_ci        case Tuple_kind:
12207db96d56Sopenharmony_ci            VISIT_CONTAINER(e, Tuple);
12217db96d56Sopenharmony_ci            return NULL;
12227db96d56Sopenharmony_ci        case Starred_kind:
12237db96d56Sopenharmony_ci            if (targets_type == DEL_TARGETS) {
12247db96d56Sopenharmony_ci                return e;
12257db96d56Sopenharmony_ci            }
12267db96d56Sopenharmony_ci            return _PyPegen_get_invalid_target(e->v.Starred.value, targets_type);
12277db96d56Sopenharmony_ci        case Compare_kind:
12287db96d56Sopenharmony_ci            // This is needed, because the `a in b` in `for a in b` gets parsed
12297db96d56Sopenharmony_ci            // as a comparison, and so we need to search the left side of the comparison
12307db96d56Sopenharmony_ci            // for invalid targets.
12317db96d56Sopenharmony_ci            if (targets_type == FOR_TARGETS) {
12327db96d56Sopenharmony_ci                cmpop_ty cmpop = (cmpop_ty) asdl_seq_GET(e->v.Compare.ops, 0);
12337db96d56Sopenharmony_ci                if (cmpop == In) {
12347db96d56Sopenharmony_ci                    return _PyPegen_get_invalid_target(e->v.Compare.left, targets_type);
12357db96d56Sopenharmony_ci                }
12367db96d56Sopenharmony_ci                return NULL;
12377db96d56Sopenharmony_ci            }
12387db96d56Sopenharmony_ci            return e;
12397db96d56Sopenharmony_ci        case Name_kind:
12407db96d56Sopenharmony_ci        case Subscript_kind:
12417db96d56Sopenharmony_ci        case Attribute_kind:
12427db96d56Sopenharmony_ci            return NULL;
12437db96d56Sopenharmony_ci        default:
12447db96d56Sopenharmony_ci            return e;
12457db96d56Sopenharmony_ci    }
12467db96d56Sopenharmony_ci}
12477db96d56Sopenharmony_ci
12487db96d56Sopenharmony_civoid *_PyPegen_arguments_parsing_error(Parser *p, expr_ty e) {
12497db96d56Sopenharmony_ci    int kwarg_unpacking = 0;
12507db96d56Sopenharmony_ci    for (Py_ssize_t i = 0, l = asdl_seq_LEN(e->v.Call.keywords); i < l; i++) {
12517db96d56Sopenharmony_ci        keyword_ty keyword = asdl_seq_GET(e->v.Call.keywords, i);
12527db96d56Sopenharmony_ci        if (!keyword->arg) {
12537db96d56Sopenharmony_ci            kwarg_unpacking = 1;
12547db96d56Sopenharmony_ci        }
12557db96d56Sopenharmony_ci    }
12567db96d56Sopenharmony_ci
12577db96d56Sopenharmony_ci    const char *msg = NULL;
12587db96d56Sopenharmony_ci    if (kwarg_unpacking) {
12597db96d56Sopenharmony_ci        msg = "positional argument follows keyword argument unpacking";
12607db96d56Sopenharmony_ci    } else {
12617db96d56Sopenharmony_ci        msg = "positional argument follows keyword argument";
12627db96d56Sopenharmony_ci    }
12637db96d56Sopenharmony_ci
12647db96d56Sopenharmony_ci    return RAISE_SYNTAX_ERROR(msg);
12657db96d56Sopenharmony_ci}
12667db96d56Sopenharmony_ci
12677db96d56Sopenharmony_civoid *
12687db96d56Sopenharmony_ci_PyPegen_nonparen_genexp_in_call(Parser *p, expr_ty args, asdl_comprehension_seq *comprehensions)
12697db96d56Sopenharmony_ci{
12707db96d56Sopenharmony_ci    /* The rule that calls this function is 'args for_if_clauses'.
12717db96d56Sopenharmony_ci       For the input f(L, x for x in y), L and x are in args and
12727db96d56Sopenharmony_ci       the for is parsed as a for_if_clause. We have to check if
12737db96d56Sopenharmony_ci       len <= 1, so that input like dict((a, b) for a, b in x)
12747db96d56Sopenharmony_ci       gets successfully parsed and then we pass the last
12757db96d56Sopenharmony_ci       argument (x in the above example) as the location of the
12767db96d56Sopenharmony_ci       error */
12777db96d56Sopenharmony_ci    Py_ssize_t len = asdl_seq_LEN(args->v.Call.args);
12787db96d56Sopenharmony_ci    if (len <= 1) {
12797db96d56Sopenharmony_ci        return NULL;
12807db96d56Sopenharmony_ci    }
12817db96d56Sopenharmony_ci
12827db96d56Sopenharmony_ci    comprehension_ty last_comprehension = PyPegen_last_item(comprehensions, comprehension_ty);
12837db96d56Sopenharmony_ci
12847db96d56Sopenharmony_ci    return RAISE_SYNTAX_ERROR_KNOWN_RANGE(
12857db96d56Sopenharmony_ci        (expr_ty) asdl_seq_GET(args->v.Call.args, len - 1),
12867db96d56Sopenharmony_ci        _PyPegen_get_last_comprehension_item(last_comprehension),
12877db96d56Sopenharmony_ci        "Generator expression must be parenthesized"
12887db96d56Sopenharmony_ci    );
12897db96d56Sopenharmony_ci}