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}