From 77de6144a453bba1834af33c99824497682ee9f1 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Sat, 19 Jan 2019 09:28:44 -0800 Subject: [PATCH 01/46] Add TYPE_IGNORE and TYPE_COMMENT without regenerating anything --- Grammar/Tokens | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Grammar/Tokens b/Grammar/Tokens index 9595673a5af7a4..d6c6ee47745672 100644 --- a/Grammar/Tokens +++ b/Grammar/Tokens @@ -54,6 +54,8 @@ RARROW '->' ELLIPSIS '...' OP +TYPE_IGNORE +TYPE_COMMENT ERRORTOKEN # These aren't used by the C tokenizer but are needed for tokenize.py From 8e0fd8a5681b717de68052b8822813721748b65e Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Sat, 19 Jan 2019 09:29:14 -0800 Subject: [PATCH 02/46] Regenerated files (make regen-token) --- Doc/library/token-list.inc | 4 ++++ Include/token.h | 6 ++++-- Lib/token.py | 12 +++++++----- Parser/token.c | 2 ++ 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/Doc/library/token-list.inc b/Doc/library/token-list.inc index cd6e0f26968eea..290d8f2cd89a75 100644 --- a/Doc/library/token-list.inc +++ b/Doc/library/token-list.inc @@ -199,6 +199,10 @@ .. data:: OP +.. data:: TYPE_IGNORE + +.. data:: TYPE_COMMENT + .. data:: ERRORTOKEN .. data:: N_TOKENS diff --git a/Include/token.h b/Include/token.h index 2d491e6927d1a9..6a1fa2cb9b8243 100644 --- a/Include/token.h +++ b/Include/token.h @@ -64,8 +64,10 @@ extern "C" { #define RARROW 51 #define ELLIPSIS 52 #define OP 53 -#define ERRORTOKEN 54 -#define N_TOKENS 58 +#define TYPE_IGNORE 54 +#define TYPE_COMMENT 55 +#define ERRORTOKEN 56 +#define N_TOKENS 60 #define NT_OFFSET 256 /* Special definitions for cooperation with parser */ diff --git a/Lib/token.py b/Lib/token.py index 5af7e6b91eaca3..43eb246c3f0412 100644 --- a/Lib/token.py +++ b/Lib/token.py @@ -57,12 +57,14 @@ RARROW = 51 ELLIPSIS = 52 OP = 53 +TYPE_IGNORE = 54 +TYPE_COMMENT = 55 # These aren't used by the C tokenizer but are needed for tokenize.py -ERRORTOKEN = 54 -COMMENT = 55 -NL = 56 -ENCODING = 57 -N_TOKENS = 58 +ERRORTOKEN = 56 +COMMENT = 57 +NL = 58 +ENCODING = 59 +N_TOKENS = 60 # Special definitions for cooperation with parser NT_OFFSET = 256 diff --git a/Parser/token.c b/Parser/token.c index 35519aa4b61161..9404fe63d611c2 100644 --- a/Parser/token.c +++ b/Parser/token.c @@ -60,6 +60,8 @@ const char * const _PyParser_TokenNames[] = { "RARROW", "ELLIPSIS", "OP", + "TYPE_IGNORE", + "TYPE_COMMENT", "", "", "", From cb93ba56bf2ba336c84c8804b3c2c26b8f403428 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Sat, 19 Jan 2019 09:30:30 -0800 Subject: [PATCH 03/46] Tentative parsetok.c changes to handle TYPE_IGNORE --- Parser/parsetok.c | 66 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/Parser/parsetok.c b/Parser/parsetok.c index 2b5254a8be67ad..40db8a2b82905f 100644 --- a/Parser/parsetok.c +++ b/Parser/parsetok.c @@ -15,6 +15,38 @@ static node *parsetok(struct tok_state *, grammar *, int, perrdetail *, int *); static int initerr(perrdetail *err_ret, PyObject * filename); +typedef struct { + int *items; + size_t size; + size_t num_items; +} growable_int_array; + +int growable_int_array_init(growable_int_array *arr, size_t initial_size) { + assert(initial_size > 0); + arr->items = malloc(initial_size * sizeof(*arr->items)); + arr->size = initial_size; + arr->num_items = 0; + + return arr->items != NULL; +} + +int growable_int_array_add(growable_int_array *arr, int item) { + if (arr->num_items >= arr->size) { + arr->size *= 2; + arr->items = realloc(arr->items, arr->size * sizeof(*arr->items)); + if (!arr->items) + return 0; + } + + arr->items[arr->num_items] = item; + arr->num_items++; + return 1; +} + +void growable_int_array_deallocate(growable_int_array *arr) { + free(arr->items); +} + /* Parse input coming from a string. Return error code, print some errors. */ node * PyParser_ParseString(const char *s, grammar *g, int start, perrdetail *err_ret) @@ -188,6 +220,13 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, node *n; int started = 0; int col_offset, end_col_offset; + growable_int_array type_ignores; + + if (!growable_int_array_init(&type_ignores, 10)) { + err_ret->error = E_NOMEM; + PyTokenizer_Free(tok); + return NULL; + } if ((ps = PyParser_New(g, start)) == NULL) { err_ret->error = E_NOMEM; @@ -277,6 +316,15 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, else { end_col_offset = -1; } + + if (type == TYPE_IGNORE) { + if (!growable_int_array_add(&type_ignores, tok->lineno)) { + err_ret->error = E_NOMEM; + break; + } + continue; + } + if ((err_ret->error = PyParser_AddToken(ps, (int)type, str, lineno, col_offset, tok->lineno, end_col_offset, @@ -293,6 +341,24 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, n = ps->p_tree; ps->p_tree = NULL; + if (n->n_type == file_input) { + /* Put type_ignore nodes in the ENDMARKER of file_input. */ + int num; + node *ch; + size_t i; + + num = NCH(n); + ch = CHILD(n, num - 1); + REQ(ch, ENDMARKER); + + for (i = 0; i < type_ignores.num_items; i++) { + PyNode_AddChild(ch, TYPE_IGNORE, NULL, + type_ignores.items[i], 0, + type_ignores.items[i], 0); + } + } + growable_int_array_deallocate(&type_ignores); + #ifndef PGEN /* Check that the source for a single input statement really is a single statement by looking at what is left in the From 232f2b676a11c725af90deef4f01440bd934f832 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Sat, 19 Jan 2019 09:48:44 -0800 Subject: [PATCH 04/46] Unconditionally recognize type comments in tokenizer.c --- Parser/tokenizer.c | 54 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 3e3cf2cd7f582a..17af219178c451 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -48,6 +48,10 @@ static int tok_nextc(struct tok_state *tok); static void tok_backup(struct tok_state *tok, int c); +/* Spaces in this constant are treated as "zero or more spaces or tabs" when + tokenizing. */ +static const char* type_comment_prefix = "# type: "; + /* Create and initialize a new tok_state structure */ static struct tok_state * @@ -1245,10 +1249,56 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) /* Set start of current token */ tok->start = tok->cur - 1; - /* Skip comment */ + /* Skip comment, unless it's a type comment */ if (c == '#') { - while (c != EOF && c != '\n') { + const char *prefix, *p, *type_start; + + while (c != EOF && c != '\n') c = tok_nextc(tok); + + p = tok->start; + prefix = type_comment_prefix; + while (*prefix && p < tok->cur) { + if (*prefix == ' ') { + while (*p == ' ' || *p == '\t') + p++; + } else if (*prefix == *p) { + p++; + } else { + break; + } + + prefix++; + } + + /* This is a type comment if we matched all of type_comment_prefix. */ + if (!*prefix) { + int is_type_ignore = 1; + tok_backup(tok, c); /* don't eat the newline or EOF */ + + type_start = p; + + is_type_ignore = tok->cur >= p + 6 && memcmp(p, "ignore", 6) == 0; + p += 6; + while (is_type_ignore && p < tok->cur) { + if (*p == '#') + break; + is_type_ignore = is_type_ignore && (*p == ' ' || *p == '\t'); + p++; + } + + if (is_type_ignore) { + /* If this type ignore is the only thing on the line, consume the newline also. */ + if (blankline) { + tok_nextc(tok); + tok->atbol = 1; + } + return TYPE_IGNORE; + } else { + *p_start = (char *) type_start; /* after type_comment_prefix */ + *p_end = tok->cur; + return TYPE_COMMENT; + } } } From c80197ec528e84efba7f616385f2a42ca853af24 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Sat, 19 Jan 2019 10:14:12 -0800 Subject: [PATCH 05/46] Changes to Grammar without regenerating anything --- Grammar/Grammar | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/Grammar/Grammar b/Grammar/Grammar index e232df979e2dae..23ec102c257a47 100644 --- a/Grammar/Grammar +++ b/Grammar/Grammar @@ -7,7 +7,10 @@ # single_input is a single interactive statement; # file_input is a module or sequence of commands read from an input file; # eval_input is the input for the eval() functions. +# func_type_input is a PEP 484 Python 2 function type comment # NB: compound_stmt in single_input is followed by extra NEWLINE! +# NB: due to the way TYPE_COMMENT is tokenized it will always be followed by a +# NEWLINE single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE file_input: (NEWLINE | stmt)* ENDMARKER eval_input: testlist NEWLINE* ENDMARKER @@ -17,14 +20,14 @@ decorators: decorator+ decorated: decorators (classdef | funcdef | async_funcdef) async_funcdef: 'async' funcdef -funcdef: 'def' NAME parameters ['->' test] ':' suite +funcdef: 'def' NAME parameters ['->' test] ':' [TYPE_COMMENT] suite parameters: '(' [typedargslist] ')' -typedargslist: (tfpdef ['=' test] (',' tfpdef ['=' test])* [',' [ - '*' [tfpdef] (',' tfpdef ['=' test])* [',' ['**' tfpdef [',']]] - | '**' tfpdef [',']]] - | '*' [tfpdef] (',' tfpdef ['=' test])* [',' ['**' tfpdef [',']]] - | '**' tfpdef [',']) +typedargslist: (tfpdef ['=' test] (',' [TYPE_COMMENT] tfpdef ['=' test])* (TYPE_COMMENT | [',' [TYPE_COMMENT] [ + '*' [tfpdef] (',' [TYPE_COMMENT] tfpdef ['=' test])* (TYPE_COMMENT | [',' [TYPE_COMMENT] ['**' tfpdef [','] [TYPE_COMMENT]]]) + | '**' tfpdef [','] [TYPE_COMMENT]]]) + | '*' [tfpdef] (',' [TYPE_COMMENT] tfpdef ['=' test])* (TYPE_COMMENT | [',' [TYPE_COMMENT] ['**' tfpdef [','] [TYPE_COMMENT]]]) + | '**' tfpdef [','] [TYPE_COMMENT]) tfpdef: NAME [':' test] varargslist: (vfpdef ['=' test] (',' vfpdef ['=' test])* [',' [ '*' [vfpdef] (',' vfpdef ['=' test])* [',' ['**' vfpdef [',']]] @@ -39,7 +42,7 @@ simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE small_stmt: (expr_stmt | del_stmt | pass_stmt | flow_stmt | import_stmt | global_stmt | nonlocal_stmt | assert_stmt) expr_stmt: testlist_star_expr (annassign | augassign (yield_expr|testlist) | - ('=' (yield_expr|testlist_star_expr))*) + ('=' (yield_expr|testlist_star_expr))* [TYPE_COMMENT]) annassign: ':' test ['=' test] testlist_star_expr: (test|star_expr) (',' (test|star_expr))* [','] augassign: ('+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' | @@ -71,17 +74,18 @@ compound_stmt: if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef async_stmt: 'async' (funcdef | with_stmt | for_stmt) if_stmt: 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] while_stmt: 'while' test ':' suite ['else' ':' suite] -for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] +for_stmt: 'for' exprlist 'in' testlist ':' [TYPE_COMMENT] suite ['else' ':' suite] try_stmt: ('try' ':' suite ((except_clause ':' suite)+ ['else' ':' suite] ['finally' ':' suite] | 'finally' ':' suite)) -with_stmt: 'with' with_item (',' with_item)* ':' suite +with_stmt: 'with' with_item (',' with_item)* ':' [TYPE_COMMENT] suite with_item: test ['as' expr] # NB compile.c makes sure that the default except clause is last except_clause: 'except' [test ['as' NAME]] -suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT +# the TYPE_COMMENT in suites is only parsed for funcdefs, but can't go elsewhere due to ambiguity +suite: simple_stmt | NEWLINE [TYPE_COMMENT NEWLINE] INDENT stmt+ DEDENT test: or_test ['if' or_test 'else' test] | lambdef test_nocond: or_test | lambdef_nocond @@ -148,3 +152,10 @@ encoding_decl: NAME yield_expr: 'yield' [yield_arg] yield_arg: 'from' test | testlist_star_expr + +func_type_input: func_type NEWLINE* ENDMARKER +func_type: '(' [typelist] ')' '->' test +# typelist is a modified typedargslist (see above) +typelist: (test (',' test)* [',' + ['*' [test] (',' test)* [',' '**' test] | '**' test]] + | '*' [test] (',' test)* [',' '**' test] | '**' test) From b440842d0849b7185262997d0cd8fec360bbd9ac Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Sat, 19 Jan 2019 10:14:32 -0800 Subject: [PATCH 06/46] Regenerated files (make regen-grammar) --- Include/graminit.h | 3 + Python/graminit.c | 993 ++++++++++++++++++++++++++------------------- 2 files changed, 587 insertions(+), 409 deletions(-) diff --git a/Include/graminit.h b/Include/graminit.h index bdfe821ad71686..6f3232c47227af 100644 --- a/Include/graminit.h +++ b/Include/graminit.h @@ -87,3 +87,6 @@ #define encoding_decl 340 #define yield_expr 341 #define yield_arg 342 +#define func_type_input 343 +#define func_type 344 +#define typelist 345 diff --git a/Python/graminit.c b/Python/graminit.c index 0a681f7b797f48..259793c9079d6c 100644 --- a/Python/graminit.c +++ b/Python/graminit.c @@ -135,30 +135,35 @@ static arc arcs_7_3[2] = { static arc arcs_7_4[1] = { {26, 6}, }; -static arc arcs_7_5[1] = { +static arc arcs_7_5[2] = { {28, 7}, + {29, 8}, }; static arc arcs_7_6[1] = { {27, 5}, }; static arc arcs_7_7[1] = { - {0, 7}, + {29, 8}, +}; +static arc arcs_7_8[1] = { + {0, 8}, }; -static state states_7[8] = { +static state states_7[9] = { {1, arcs_7_0}, {1, arcs_7_1}, {1, arcs_7_2}, {2, arcs_7_3}, {1, arcs_7_4}, - {1, arcs_7_5}, + {2, arcs_7_5}, {1, arcs_7_6}, {1, arcs_7_7}, + {1, arcs_7_8}, }; static arc arcs_8_0[1] = { {13, 1}, }; static arc arcs_8_1[2] = { - {29, 2}, + {30, 2}, {15, 3}, }; static arc arcs_8_2[1] = { @@ -174,107 +179,144 @@ static state states_8[4] = { {1, arcs_8_3}, }; static arc arcs_9_0[3] = { - {30, 1}, - {33, 2}, - {34, 3}, + {31, 1}, + {34, 2}, + {35, 3}, }; -static arc arcs_9_1[3] = { - {31, 4}, - {32, 5}, +static arc arcs_9_1[4] = { + {32, 4}, + {33, 5}, + {28, 6}, {0, 1}, }; -static arc arcs_9_2[3] = { - {30, 6}, - {32, 7}, +static arc arcs_9_2[4] = { + {31, 7}, + {33, 8}, + {28, 6}, {0, 2}, }; static arc arcs_9_3[1] = { - {30, 8}, + {31, 9}, }; static arc arcs_9_4[1] = { - {26, 9}, + {26, 10}, }; -static arc arcs_9_5[4] = { - {30, 10}, - {33, 11}, - {34, 3}, +static arc arcs_9_5[5] = { + {28, 11}, + {31, 12}, + {34, 13}, + {35, 3}, {0, 5}, }; -static arc arcs_9_6[2] = { - {32, 7}, +static arc arcs_9_6[1] = { {0, 6}, }; static arc arcs_9_7[3] = { - {30, 12}, - {34, 3}, + {33, 8}, + {28, 6}, {0, 7}, }; -static arc arcs_9_8[2] = { - {32, 13}, +static arc arcs_9_8[4] = { + {28, 14}, + {31, 15}, + {35, 3}, {0, 8}, }; -static arc arcs_9_9[2] = { - {32, 5}, +static arc arcs_9_9[3] = { + {33, 16}, + {28, 6}, {0, 9}, }; static arc arcs_9_10[3] = { - {32, 5}, - {31, 4}, + {33, 5}, + {28, 6}, {0, 10}, }; -static arc arcs_9_11[3] = { - {30, 14}, - {32, 15}, +static arc arcs_9_11[4] = { + {31, 12}, + {34, 13}, + {35, 3}, {0, 11}, }; -static arc arcs_9_12[3] = { - {32, 7}, - {31, 16}, +static arc arcs_9_12[4] = { + {33, 5}, + {32, 4}, + {28, 6}, {0, 12}, }; -static arc arcs_9_13[1] = { +static arc arcs_9_13[4] = { + {31, 17}, + {33, 18}, + {28, 6}, {0, 13}, }; -static arc arcs_9_14[2] = { - {32, 15}, +static arc arcs_9_14[3] = { + {31, 15}, + {35, 3}, {0, 14}, }; -static arc arcs_9_15[3] = { - {30, 17}, - {34, 3}, +static arc arcs_9_15[4] = { + {33, 8}, + {32, 19}, + {28, 6}, {0, 15}, }; -static arc arcs_9_16[1] = { - {26, 6}, +static arc arcs_9_16[2] = { + {28, 6}, + {0, 16}, }; static arc arcs_9_17[3] = { - {32, 15}, - {31, 18}, + {33, 18}, + {28, 6}, {0, 17}, }; -static arc arcs_9_18[1] = { - {26, 14}, +static arc arcs_9_18[4] = { + {28, 20}, + {31, 21}, + {35, 3}, + {0, 18}, +}; +static arc arcs_9_19[1] = { + {26, 7}, }; -static state states_9[19] = { +static arc arcs_9_20[3] = { + {31, 21}, + {35, 3}, + {0, 20}, +}; +static arc arcs_9_21[4] = { + {33, 18}, + {32, 22}, + {28, 6}, + {0, 21}, +}; +static arc arcs_9_22[1] = { + {26, 17}, +}; +static state states_9[23] = { {3, arcs_9_0}, - {3, arcs_9_1}, - {3, arcs_9_2}, + {4, arcs_9_1}, + {4, arcs_9_2}, {1, arcs_9_3}, {1, arcs_9_4}, - {4, arcs_9_5}, - {2, arcs_9_6}, + {5, arcs_9_5}, + {1, arcs_9_6}, {3, arcs_9_7}, - {2, arcs_9_8}, - {2, arcs_9_9}, + {4, arcs_9_8}, + {3, arcs_9_9}, {3, arcs_9_10}, - {3, arcs_9_11}, - {3, arcs_9_12}, - {1, arcs_9_13}, - {2, arcs_9_14}, - {3, arcs_9_15}, - {1, arcs_9_16}, + {4, arcs_9_11}, + {4, arcs_9_12}, + {4, arcs_9_13}, + {3, arcs_9_14}, + {4, arcs_9_15}, + {2, arcs_9_16}, {3, arcs_9_17}, - {1, arcs_9_18}, + {4, arcs_9_18}, + {1, arcs_9_19}, + {3, arcs_9_20}, + {4, arcs_9_21}, + {1, arcs_9_22}, }; static arc arcs_10_0[1] = { {23, 1}, @@ -296,82 +338,82 @@ static state states_10[4] = { {1, arcs_10_3}, }; static arc arcs_11_0[3] = { - {36, 1}, - {33, 2}, - {34, 3}, + {37, 1}, + {34, 2}, + {35, 3}, }; static arc arcs_11_1[3] = { - {31, 4}, - {32, 5}, + {32, 4}, + {33, 5}, {0, 1}, }; static arc arcs_11_2[3] = { - {36, 6}, - {32, 7}, + {37, 6}, + {33, 7}, {0, 2}, }; static arc arcs_11_3[1] = { - {36, 8}, + {37, 8}, }; static arc arcs_11_4[1] = { {26, 9}, }; static arc arcs_11_5[4] = { - {36, 10}, - {33, 11}, - {34, 3}, + {37, 10}, + {34, 11}, + {35, 3}, {0, 5}, }; static arc arcs_11_6[2] = { - {32, 7}, + {33, 7}, {0, 6}, }; static arc arcs_11_7[3] = { - {36, 12}, - {34, 3}, + {37, 12}, + {35, 3}, {0, 7}, }; static arc arcs_11_8[2] = { - {32, 13}, + {33, 13}, {0, 8}, }; static arc arcs_11_9[2] = { - {32, 5}, + {33, 5}, {0, 9}, }; static arc arcs_11_10[3] = { - {32, 5}, - {31, 4}, + {33, 5}, + {32, 4}, {0, 10}, }; static arc arcs_11_11[3] = { - {36, 14}, - {32, 15}, + {37, 14}, + {33, 15}, {0, 11}, }; static arc arcs_11_12[3] = { - {32, 7}, - {31, 16}, + {33, 7}, + {32, 16}, {0, 12}, }; static arc arcs_11_13[1] = { {0, 13}, }; static arc arcs_11_14[2] = { - {32, 15}, + {33, 15}, {0, 14}, }; static arc arcs_11_15[3] = { - {36, 17}, - {34, 3}, + {37, 17}, + {35, 3}, {0, 15}, }; static arc arcs_11_16[1] = { {26, 6}, }; static arc arcs_11_17[3] = { - {32, 15}, - {31, 18}, + {33, 15}, + {32, 18}, {0, 17}, }; static arc arcs_11_18[1] = { @@ -420,14 +462,14 @@ static state states_13[2] = { {1, arcs_13_1}, }; static arc arcs_14_0[1] = { - {37, 1}, + {38, 1}, }; static arc arcs_14_1[2] = { - {38, 2}, + {39, 2}, {2, 3}, }; static arc arcs_14_2[2] = { - {37, 1}, + {38, 1}, {2, 3}, }; static arc arcs_14_3[1] = { @@ -440,7 +482,6 @@ static state states_14[4] = { {1, arcs_14_3}, }; static arc arcs_15_0[8] = { - {39, 1}, {40, 1}, {41, 1}, {42, 1}, @@ -448,6 +489,7 @@ static arc arcs_15_0[8] = { {44, 1}, {45, 1}, {46, 1}, + {47, 1}, }; static arc arcs_15_1[1] = { {0, 1}, @@ -457,36 +499,38 @@ static state states_15[2] = { {1, arcs_15_1}, }; static arc arcs_16_0[1] = { - {47, 1}, + {48, 1}, }; -static arc arcs_16_1[4] = { - {48, 2}, - {49, 3}, - {31, 4}, +static arc arcs_16_1[5] = { + {49, 2}, + {50, 3}, + {32, 4}, + {28, 2}, {0, 1}, }; static arc arcs_16_2[1] = { {0, 2}, }; static arc arcs_16_3[2] = { - {50, 2}, + {51, 2}, {9, 2}, }; static arc arcs_16_4[2] = { - {50, 5}, - {47, 5}, + {51, 5}, + {48, 5}, }; -static arc arcs_16_5[2] = { - {31, 4}, +static arc arcs_16_5[3] = { + {32, 4}, + {28, 2}, {0, 5}, }; static state states_16[6] = { {1, arcs_16_0}, - {4, arcs_16_1}, + {5, arcs_16_1}, {1, arcs_16_2}, {2, arcs_16_3}, {2, arcs_16_4}, - {2, arcs_16_5}, + {3, arcs_16_5}, }; static arc arcs_17_0[1] = { {27, 1}, @@ -495,7 +539,7 @@ static arc arcs_17_1[1] = { {26, 2}, }; static arc arcs_17_2[2] = { - {31, 3}, + {32, 3}, {0, 2}, }; static arc arcs_17_3[1] = { @@ -513,15 +557,15 @@ static state states_17[5] = { }; static arc arcs_18_0[2] = { {26, 1}, - {51, 1}, + {52, 1}, }; static arc arcs_18_1[2] = { - {32, 2}, + {33, 2}, {0, 1}, }; static arc arcs_18_2[3] = { {26, 1}, - {51, 1}, + {52, 1}, {0, 2}, }; static state states_18[3] = { @@ -530,7 +574,6 @@ static state states_18[3] = { {3, arcs_18_2}, }; static arc arcs_19_0[13] = { - {52, 1}, {53, 1}, {54, 1}, {55, 1}, @@ -543,6 +586,7 @@ static arc arcs_19_0[13] = { {62, 1}, {63, 1}, {64, 1}, + {65, 1}, }; static arc arcs_19_1[1] = { {0, 1}, @@ -552,10 +596,10 @@ static state states_19[2] = { {1, arcs_19_1}, }; static arc arcs_20_0[1] = { - {65, 1}, + {66, 1}, }; static arc arcs_20_1[1] = { - {66, 2}, + {67, 2}, }; static arc arcs_20_2[1] = { {0, 2}, @@ -566,7 +610,7 @@ static state states_20[3] = { {1, arcs_20_2}, }; static arc arcs_21_0[1] = { - {67, 1}, + {68, 1}, }; static arc arcs_21_1[1] = { {0, 1}, @@ -576,11 +620,11 @@ static state states_21[2] = { {1, arcs_21_1}, }; static arc arcs_22_0[5] = { - {68, 1}, {69, 1}, {70, 1}, {71, 1}, {72, 1}, + {73, 1}, }; static arc arcs_22_1[1] = { {0, 1}, @@ -590,7 +634,7 @@ static state states_22[2] = { {1, arcs_22_1}, }; static arc arcs_23_0[1] = { - {73, 1}, + {74, 1}, }; static arc arcs_23_1[1] = { {0, 1}, @@ -600,7 +644,7 @@ static state states_23[2] = { {1, arcs_23_1}, }; static arc arcs_24_0[1] = { - {74, 1}, + {75, 1}, }; static arc arcs_24_1[1] = { {0, 1}, @@ -610,10 +654,10 @@ static state states_24[2] = { {1, arcs_24_1}, }; static arc arcs_25_0[1] = { - {75, 1}, + {76, 1}, }; static arc arcs_25_1[2] = { - {47, 2}, + {48, 2}, {0, 1}, }; static arc arcs_25_2[1] = { @@ -625,7 +669,7 @@ static state states_25[3] = { {1, arcs_25_2}, }; static arc arcs_26_0[1] = { - {50, 1}, + {51, 1}, }; static arc arcs_26_1[1] = { {0, 1}, @@ -635,14 +679,14 @@ static state states_26[2] = { {1, arcs_26_1}, }; static arc arcs_27_0[1] = { - {76, 1}, + {77, 1}, }; static arc arcs_27_1[2] = { {26, 2}, {0, 1}, }; static arc arcs_27_2[2] = { - {77, 3}, + {78, 3}, {0, 2}, }; static arc arcs_27_3[1] = { @@ -659,8 +703,8 @@ static state states_27[5] = { {1, arcs_27_4}, }; static arc arcs_28_0[2] = { - {78, 1}, {79, 1}, + {80, 1}, }; static arc arcs_28_1[1] = { {0, 1}, @@ -670,10 +714,10 @@ static state states_28[2] = { {1, arcs_28_1}, }; static arc arcs_29_0[1] = { - {80, 1}, + {81, 1}, }; static arc arcs_29_1[1] = { - {81, 2}, + {82, 2}, }; static arc arcs_29_2[1] = { {0, 2}, @@ -684,32 +728,32 @@ static state states_29[3] = { {1, arcs_29_2}, }; static arc arcs_30_0[1] = { - {77, 1}, + {78, 1}, }; static arc arcs_30_1[3] = { - {82, 2}, {83, 2}, + {84, 2}, {12, 3}, }; static arc arcs_30_2[4] = { - {82, 2}, {83, 2}, + {84, 2}, {12, 3}, - {80, 4}, + {81, 4}, }; static arc arcs_30_3[1] = { - {80, 4}, + {81, 4}, }; static arc arcs_30_4[3] = { - {33, 5}, + {34, 5}, {13, 6}, - {84, 5}, + {85, 5}, }; static arc arcs_30_5[1] = { {0, 5}, }; static arc arcs_30_6[1] = { - {84, 7}, + {85, 7}, }; static arc arcs_30_7[1] = { {15, 5}, @@ -728,7 +772,7 @@ static arc arcs_31_0[1] = { {23, 1}, }; static arc arcs_31_1[2] = { - {86, 2}, + {87, 2}, {0, 1}, }; static arc arcs_31_2[1] = { @@ -747,7 +791,7 @@ static arc arcs_32_0[1] = { {12, 1}, }; static arc arcs_32_1[2] = { - {86, 2}, + {87, 2}, {0, 1}, }; static arc arcs_32_2[1] = { @@ -763,14 +807,14 @@ static state states_32[4] = { {1, arcs_32_3}, }; static arc arcs_33_0[1] = { - {85, 1}, + {86, 1}, }; static arc arcs_33_1[2] = { - {32, 2}, + {33, 2}, {0, 1}, }; static arc arcs_33_2[2] = { - {85, 1}, + {86, 1}, {0, 2}, }; static state states_33[3] = { @@ -779,10 +823,10 @@ static state states_33[3] = { {2, arcs_33_2}, }; static arc arcs_34_0[1] = { - {87, 1}, + {88, 1}, }; static arc arcs_34_1[2] = { - {32, 0}, + {33, 0}, {0, 1}, }; static state states_34[2] = { @@ -793,7 +837,7 @@ static arc arcs_35_0[1] = { {23, 1}, }; static arc arcs_35_1[2] = { - {82, 0}, + {83, 0}, {0, 1}, }; static state states_35[2] = { @@ -801,13 +845,13 @@ static state states_35[2] = { {2, arcs_35_1}, }; static arc arcs_36_0[1] = { - {88, 1}, + {89, 1}, }; static arc arcs_36_1[1] = { {23, 2}, }; static arc arcs_36_2[2] = { - {32, 1}, + {33, 1}, {0, 2}, }; static state states_36[3] = { @@ -816,13 +860,13 @@ static state states_36[3] = { {2, arcs_36_2}, }; static arc arcs_37_0[1] = { - {89, 1}, + {90, 1}, }; static arc arcs_37_1[1] = { {23, 2}, }; static arc arcs_37_2[2] = { - {32, 1}, + {33, 1}, {0, 2}, }; static state states_37[3] = { @@ -831,13 +875,13 @@ static state states_37[3] = { {2, arcs_37_2}, }; static arc arcs_38_0[1] = { - {90, 1}, + {91, 1}, }; static arc arcs_38_1[1] = { {26, 2}, }; static arc arcs_38_2[2] = { - {32, 3}, + {33, 3}, {0, 2}, }; static arc arcs_38_3[1] = { @@ -854,15 +898,15 @@ static state states_38[5] = { {1, arcs_38_4}, }; static arc arcs_39_0[9] = { - {91, 1}, {92, 1}, {93, 1}, {94, 1}, {95, 1}, + {96, 1}, {19, 1}, {18, 1}, {17, 1}, - {96, 1}, + {97, 1}, }; static arc arcs_39_1[1] = { {0, 1}, @@ -876,8 +920,8 @@ static arc arcs_40_0[1] = { }; static arc arcs_40_1[3] = { {19, 2}, - {95, 2}, - {93, 2}, + {96, 2}, + {94, 2}, }; static arc arcs_40_2[1] = { {0, 2}, @@ -888,7 +932,7 @@ static state states_40[3] = { {1, arcs_40_2}, }; static arc arcs_41_0[1] = { - {97, 1}, + {98, 1}, }; static arc arcs_41_1[1] = { {26, 2}, @@ -897,18 +941,18 @@ static arc arcs_41_2[1] = { {27, 3}, }; static arc arcs_41_3[1] = { - {28, 4}, + {29, 4}, }; static arc arcs_41_4[3] = { - {98, 1}, - {99, 5}, + {99, 1}, + {100, 5}, {0, 4}, }; static arc arcs_41_5[1] = { {27, 6}, }; static arc arcs_41_6[1] = { - {28, 7}, + {29, 7}, }; static arc arcs_41_7[1] = { {0, 7}, @@ -924,7 +968,7 @@ static state states_41[8] = { {1, arcs_41_7}, }; static arc arcs_42_0[1] = { - {100, 1}, + {101, 1}, }; static arc arcs_42_1[1] = { {26, 2}, @@ -933,17 +977,17 @@ static arc arcs_42_2[1] = { {27, 3}, }; static arc arcs_42_3[1] = { - {28, 4}, + {29, 4}, }; static arc arcs_42_4[2] = { - {99, 5}, + {100, 5}, {0, 4}, }; static arc arcs_42_5[1] = { {27, 6}, }; static arc arcs_42_6[1] = { - {28, 7}, + {29, 7}, }; static arc arcs_42_7[1] = { {0, 7}, @@ -959,13 +1003,13 @@ static state states_42[8] = { {1, arcs_42_7}, }; static arc arcs_43_0[1] = { - {101, 1}, + {102, 1}, }; static arc arcs_43_1[1] = { - {66, 2}, + {67, 2}, }; static arc arcs_43_2[1] = { - {102, 3}, + {103, 3}, }; static arc arcs_43_3[1] = { {9, 4}, @@ -973,46 +1017,51 @@ static arc arcs_43_3[1] = { static arc arcs_43_4[1] = { {27, 5}, }; -static arc arcs_43_5[1] = { +static arc arcs_43_5[2] = { {28, 6}, + {29, 7}, }; -static arc arcs_43_6[2] = { - {99, 7}, - {0, 6}, +static arc arcs_43_6[1] = { + {29, 7}, }; -static arc arcs_43_7[1] = { - {27, 8}, +static arc arcs_43_7[2] = { + {100, 8}, + {0, 7}, }; static arc arcs_43_8[1] = { - {28, 9}, + {27, 9}, }; static arc arcs_43_9[1] = { - {0, 9}, + {29, 10}, +}; +static arc arcs_43_10[1] = { + {0, 10}, }; -static state states_43[10] = { +static state states_43[11] = { {1, arcs_43_0}, {1, arcs_43_1}, {1, arcs_43_2}, {1, arcs_43_3}, {1, arcs_43_4}, - {1, arcs_43_5}, - {2, arcs_43_6}, - {1, arcs_43_7}, + {2, arcs_43_5}, + {1, arcs_43_6}, + {2, arcs_43_7}, {1, arcs_43_8}, {1, arcs_43_9}, + {1, arcs_43_10}, }; static arc arcs_44_0[1] = { - {103, 1}, + {104, 1}, }; static arc arcs_44_1[1] = { {27, 2}, }; static arc arcs_44_2[1] = { - {28, 3}, + {29, 3}, }; static arc arcs_44_3[2] = { - {104, 4}, - {105, 5}, + {105, 4}, + {106, 5}, }; static arc arcs_44_4[1] = { {27, 6}, @@ -1021,15 +1070,15 @@ static arc arcs_44_5[1] = { {27, 7}, }; static arc arcs_44_6[1] = { - {28, 8}, + {29, 8}, }; static arc arcs_44_7[1] = { - {28, 9}, + {29, 9}, }; static arc arcs_44_8[4] = { - {104, 4}, - {99, 10}, - {105, 5}, + {105, 4}, + {100, 10}, + {106, 5}, {0, 8}, }; static arc arcs_44_9[1] = { @@ -1039,10 +1088,10 @@ static arc arcs_44_10[1] = { {27, 11}, }; static arc arcs_44_11[1] = { - {28, 12}, + {29, 12}, }; static arc arcs_44_12[2] = { - {105, 5}, + {106, 5}, {0, 12}, }; static state states_44[13] = { @@ -1061,37 +1110,42 @@ static state states_44[13] = { {2, arcs_44_12}, }; static arc arcs_45_0[1] = { - {106, 1}, + {107, 1}, }; static arc arcs_45_1[1] = { - {107, 2}, + {108, 2}, }; static arc arcs_45_2[2] = { - {32, 1}, + {33, 1}, {27, 3}, }; -static arc arcs_45_3[1] = { +static arc arcs_45_3[2] = { {28, 4}, + {29, 5}, }; static arc arcs_45_4[1] = { - {0, 4}, + {29, 5}, +}; +static arc arcs_45_5[1] = { + {0, 5}, }; -static state states_45[5] = { +static state states_45[6] = { {1, arcs_45_0}, {1, arcs_45_1}, {2, arcs_45_2}, - {1, arcs_45_3}, + {2, arcs_45_3}, {1, arcs_45_4}, + {1, arcs_45_5}, }; static arc arcs_46_0[1] = { {26, 1}, }; static arc arcs_46_1[2] = { - {86, 2}, + {87, 2}, {0, 1}, }; static arc arcs_46_2[1] = { - {108, 3}, + {109, 3}, }; static arc arcs_46_3[1] = { {0, 3}, @@ -1103,14 +1157,14 @@ static state states_46[4] = { {1, arcs_46_3}, }; static arc arcs_47_0[1] = { - {109, 1}, + {110, 1}, }; static arc arcs_47_1[2] = { {26, 2}, {0, 1}, }; static arc arcs_47_2[2] = { - {86, 3}, + {87, 3}, {0, 2}, }; static arc arcs_47_3[1] = { @@ -1133,39 +1187,48 @@ static arc arcs_48_0[2] = { static arc arcs_48_1[1] = { {0, 1}, }; -static arc arcs_48_2[1] = { - {110, 3}, +static arc arcs_48_2[2] = { + {28, 3}, + {111, 4}, }; static arc arcs_48_3[1] = { - {6, 4}, + {2, 5}, }; -static arc arcs_48_4[2] = { - {6, 4}, - {111, 1}, +static arc arcs_48_4[1] = { + {6, 6}, }; -static state states_48[5] = { +static arc arcs_48_5[1] = { + {111, 4}, +}; +static arc arcs_48_6[2] = { + {6, 6}, + {112, 1}, +}; +static state states_48[7] = { {2, arcs_48_0}, {1, arcs_48_1}, - {1, arcs_48_2}, + {2, arcs_48_2}, {1, arcs_48_3}, - {2, arcs_48_4}, + {1, arcs_48_4}, + {1, arcs_48_5}, + {2, arcs_48_6}, }; static arc arcs_49_0[2] = { - {112, 1}, - {113, 2}, + {113, 1}, + {114, 2}, }; static arc arcs_49_1[2] = { - {97, 3}, + {98, 3}, {0, 1}, }; static arc arcs_49_2[1] = { {0, 2}, }; static arc arcs_49_3[1] = { - {112, 4}, + {113, 4}, }; static arc arcs_49_4[1] = { - {99, 5}, + {100, 5}, }; static arc arcs_49_5[1] = { {26, 2}, @@ -1179,8 +1242,8 @@ static state states_49[6] = { {1, arcs_49_5}, }; static arc arcs_50_0[2] = { - {112, 1}, - {115, 1}, + {113, 1}, + {116, 1}, }; static arc arcs_50_1[1] = { {0, 1}, @@ -1190,10 +1253,10 @@ static state states_50[2] = { {1, arcs_50_1}, }; static arc arcs_51_0[1] = { - {116, 1}, + {117, 1}, }; static arc arcs_51_1[2] = { - {35, 2}, + {36, 2}, {27, 3}, }; static arc arcs_51_2[1] = { @@ -1213,17 +1276,17 @@ static state states_51[5] = { {1, arcs_51_4}, }; static arc arcs_52_0[1] = { - {116, 1}, + {117, 1}, }; static arc arcs_52_1[2] = { - {35, 2}, + {36, 2}, {27, 3}, }; static arc arcs_52_2[1] = { {27, 3}, }; static arc arcs_52_3[1] = { - {114, 4}, + {115, 4}, }; static arc arcs_52_4[1] = { {0, 4}, @@ -1236,10 +1299,10 @@ static state states_52[5] = { {1, arcs_52_4}, }; static arc arcs_53_0[1] = { - {117, 1}, + {118, 1}, }; static arc arcs_53_1[2] = { - {118, 0}, + {119, 0}, {0, 1}, }; static state states_53[2] = { @@ -1247,10 +1310,10 @@ static state states_53[2] = { {2, arcs_53_1}, }; static arc arcs_54_0[1] = { - {119, 1}, + {120, 1}, }; static arc arcs_54_1[2] = { - {120, 0}, + {121, 0}, {0, 1}, }; static state states_54[2] = { @@ -1258,11 +1321,11 @@ static state states_54[2] = { {2, arcs_54_1}, }; static arc arcs_55_0[2] = { - {121, 1}, - {122, 2}, + {122, 1}, + {123, 2}, }; static arc arcs_55_1[1] = { - {119, 2}, + {120, 2}, }; static arc arcs_55_2[1] = { {0, 2}, @@ -1273,10 +1336,10 @@ static state states_55[3] = { {1, arcs_55_2}, }; static arc arcs_56_0[1] = { - {108, 1}, + {109, 1}, }; static arc arcs_56_1[2] = { - {123, 0}, + {124, 0}, {0, 1}, }; static state states_56[2] = { @@ -1284,25 +1347,25 @@ static state states_56[2] = { {2, arcs_56_1}, }; static arc arcs_57_0[10] = { - {124, 1}, {125, 1}, {126, 1}, {127, 1}, {128, 1}, {129, 1}, {130, 1}, - {102, 1}, - {121, 2}, - {131, 3}, + {131, 1}, + {103, 1}, + {122, 2}, + {132, 3}, }; static arc arcs_57_1[1] = { {0, 1}, }; static arc arcs_57_2[1] = { - {102, 1}, + {103, 1}, }; static arc arcs_57_3[2] = { - {121, 1}, + {122, 1}, {0, 3}, }; static state states_57[4] = { @@ -1312,10 +1375,10 @@ static state states_57[4] = { {2, arcs_57_3}, }; static arc arcs_58_0[1] = { - {33, 1}, + {34, 1}, }; static arc arcs_58_1[1] = { - {108, 2}, + {109, 2}, }; static arc arcs_58_2[1] = { {0, 2}, @@ -1326,10 +1389,10 @@ static state states_58[3] = { {1, arcs_58_2}, }; static arc arcs_59_0[1] = { - {132, 1}, + {133, 1}, }; static arc arcs_59_1[2] = { - {133, 0}, + {134, 0}, {0, 1}, }; static state states_59[2] = { @@ -1337,10 +1400,10 @@ static state states_59[2] = { {2, arcs_59_1}, }; static arc arcs_60_0[1] = { - {134, 1}, + {135, 1}, }; static arc arcs_60_1[2] = { - {135, 0}, + {136, 0}, {0, 1}, }; static state states_60[2] = { @@ -1348,10 +1411,10 @@ static state states_60[2] = { {2, arcs_60_1}, }; static arc arcs_61_0[1] = { - {136, 1}, + {137, 1}, }; static arc arcs_61_1[2] = { - {137, 0}, + {138, 0}, {0, 1}, }; static state states_61[2] = { @@ -1359,11 +1422,11 @@ static state states_61[2] = { {2, arcs_61_1}, }; static arc arcs_62_0[1] = { - {138, 1}, + {139, 1}, }; static arc arcs_62_1[3] = { - {139, 0}, {140, 0}, + {141, 0}, {0, 1}, }; static state states_62[2] = { @@ -1371,11 +1434,11 @@ static state states_62[2] = { {3, arcs_62_1}, }; static arc arcs_63_0[1] = { - {141, 1}, + {142, 1}, }; static arc arcs_63_1[3] = { - {142, 0}, {143, 0}, + {144, 0}, {0, 1}, }; static state states_63[2] = { @@ -1383,14 +1446,14 @@ static state states_63[2] = { {3, arcs_63_1}, }; static arc arcs_64_0[1] = { - {144, 1}, + {145, 1}, }; static arc arcs_64_1[6] = { - {33, 0}, + {34, 0}, {11, 0}, - {145, 0}, {146, 0}, {147, 0}, + {148, 0}, {0, 1}, }; static state states_64[2] = { @@ -1398,13 +1461,13 @@ static state states_64[2] = { {6, arcs_64_1}, }; static arc arcs_65_0[4] = { - {142, 1}, {143, 1}, - {148, 1}, - {149, 2}, + {144, 1}, + {149, 1}, + {150, 2}, }; static arc arcs_65_1[1] = { - {144, 2}, + {145, 2}, }; static arc arcs_65_2[1] = { {0, 2}, @@ -1415,14 +1478,14 @@ static state states_65[3] = { {1, arcs_65_2}, }; static arc arcs_66_0[1] = { - {150, 1}, + {151, 1}, }; static arc arcs_66_1[2] = { - {34, 2}, + {35, 2}, {0, 1}, }; static arc arcs_66_2[1] = { - {144, 3}, + {145, 3}, }; static arc arcs_66_3[1] = { {0, 3}, @@ -1434,14 +1497,14 @@ static state states_66[4] = { {1, arcs_66_3}, }; static arc arcs_67_0[2] = { - {151, 1}, - {152, 2}, + {152, 1}, + {153, 2}, }; static arc arcs_67_1[1] = { - {152, 2}, + {153, 2}, }; static arc arcs_67_2[2] = { - {153, 2}, + {154, 2}, {0, 2}, }; static state states_67[3] = { @@ -1451,44 +1514,44 @@ static state states_67[3] = { }; static arc arcs_68_0[10] = { {13, 1}, - {155, 2}, - {157, 3}, + {156, 2}, + {158, 3}, {23, 4}, - {160, 4}, - {161, 5}, - {83, 4}, - {162, 4}, + {161, 4}, + {162, 5}, + {84, 4}, {163, 4}, {164, 4}, + {165, 4}, }; static arc arcs_68_1[3] = { - {50, 6}, - {154, 6}, + {51, 6}, + {155, 6}, {15, 4}, }; static arc arcs_68_2[2] = { - {154, 7}, - {156, 4}, + {155, 7}, + {157, 4}, }; static arc arcs_68_3[2] = { - {158, 8}, - {159, 4}, + {159, 8}, + {160, 4}, }; static arc arcs_68_4[1] = { {0, 4}, }; static arc arcs_68_5[2] = { - {161, 5}, + {162, 5}, {0, 5}, }; static arc arcs_68_6[1] = { {15, 4}, }; static arc arcs_68_7[1] = { - {156, 4}, + {157, 4}, }; static arc arcs_68_8[1] = { - {159, 4}, + {160, 4}, }; static state states_68[9] = { {10, arcs_68_0}, @@ -1503,11 +1566,11 @@ static state states_68[9] = { }; static arc arcs_69_0[2] = { {26, 1}, - {51, 1}, + {52, 1}, }; static arc arcs_69_1[3] = { - {165, 2}, - {32, 3}, + {166, 2}, + {33, 3}, {0, 1}, }; static arc arcs_69_2[1] = { @@ -1515,11 +1578,11 @@ static arc arcs_69_2[1] = { }; static arc arcs_69_3[3] = { {26, 4}, - {51, 4}, + {52, 4}, {0, 3}, }; static arc arcs_69_4[2] = { - {32, 3}, + {33, 3}, {0, 4}, }; static state states_69[5] = { @@ -1531,15 +1594,15 @@ static state states_69[5] = { }; static arc arcs_70_0[3] = { {13, 1}, - {155, 2}, - {82, 3}, + {156, 2}, + {83, 3}, }; static arc arcs_70_1[2] = { {14, 4}, {15, 5}, }; static arc arcs_70_2[1] = { - {166, 6}, + {167, 6}, }; static arc arcs_70_3[1] = { {23, 5}, @@ -1551,7 +1614,7 @@ static arc arcs_70_5[1] = { {0, 5}, }; static arc arcs_70_6[1] = { - {156, 5}, + {157, 5}, }; static state states_70[7] = { {3, arcs_70_0}, @@ -1563,14 +1626,14 @@ static state states_70[7] = { {1, arcs_70_6}, }; static arc arcs_71_0[1] = { - {167, 1}, + {168, 1}, }; static arc arcs_71_1[2] = { - {32, 2}, + {33, 2}, {0, 1}, }; static arc arcs_71_2[2] = { - {167, 1}, + {168, 1}, {0, 2}, }; static state states_71[3] = { @@ -1588,11 +1651,11 @@ static arc arcs_72_1[2] = { }; static arc arcs_72_2[3] = { {26, 3}, - {168, 4}, + {169, 4}, {0, 2}, }; static arc arcs_72_3[2] = { - {168, 4}, + {169, 4}, {0, 3}, }; static arc arcs_72_4[1] = { @@ -1621,16 +1684,16 @@ static state states_73[3] = { {1, arcs_73_2}, }; static arc arcs_74_0[2] = { - {108, 1}, - {51, 1}, + {109, 1}, + {52, 1}, }; static arc arcs_74_1[2] = { - {32, 2}, + {33, 2}, {0, 1}, }; static arc arcs_74_2[3] = { - {108, 1}, - {51, 1}, + {109, 1}, + {52, 1}, {0, 2}, }; static state states_74[3] = { @@ -1642,7 +1705,7 @@ static arc arcs_75_0[1] = { {26, 1}, }; static arc arcs_75_1[2] = { - {32, 2}, + {33, 2}, {0, 1}, }; static arc arcs_75_2[2] = { @@ -1656,21 +1719,21 @@ static state states_75[3] = { }; static arc arcs_76_0[3] = { {26, 1}, - {34, 2}, - {51, 3}, + {35, 2}, + {52, 3}, }; static arc arcs_76_1[4] = { {27, 4}, - {165, 5}, - {32, 6}, + {166, 5}, + {33, 6}, {0, 1}, }; static arc arcs_76_2[1] = { - {108, 7}, + {109, 7}, }; static arc arcs_76_3[3] = { - {165, 5}, - {32, 6}, + {166, 5}, + {33, 6}, {0, 3}, }; static arc arcs_76_4[1] = { @@ -1681,34 +1744,34 @@ static arc arcs_76_5[1] = { }; static arc arcs_76_6[3] = { {26, 8}, - {51, 8}, + {52, 8}, {0, 6}, }; static arc arcs_76_7[3] = { - {165, 5}, - {32, 9}, + {166, 5}, + {33, 9}, {0, 7}, }; static arc arcs_76_8[2] = { - {32, 6}, + {33, 6}, {0, 8}, }; static arc arcs_76_9[3] = { {26, 10}, - {34, 11}, + {35, 11}, {0, 9}, }; static arc arcs_76_10[1] = { {27, 12}, }; static arc arcs_76_11[1] = { - {108, 13}, + {109, 13}, }; static arc arcs_76_12[1] = { {26, 13}, }; static arc arcs_76_13[2] = { - {32, 9}, + {33, 9}, {0, 13}, }; static state states_76[14] = { @@ -1728,7 +1791,7 @@ static state states_76[14] = { {2, arcs_76_13}, }; static arc arcs_77_0[1] = { - {169, 1}, + {170, 1}, }; static arc arcs_77_1[1] = { {23, 2}, @@ -1742,7 +1805,7 @@ static arc arcs_77_3[2] = { {15, 6}, }; static arc arcs_77_4[1] = { - {28, 7}, + {29, 7}, }; static arc arcs_77_5[1] = { {15, 6}, @@ -1764,14 +1827,14 @@ static state states_77[8] = { {1, arcs_77_7}, }; static arc arcs_78_0[1] = { - {170, 1}, + {171, 1}, }; static arc arcs_78_1[2] = { - {32, 2}, + {33, 2}, {0, 1}, }; static arc arcs_78_2[2] = { - {170, 1}, + {171, 1}, {0, 2}, }; static state states_78[3] = { @@ -1781,12 +1844,12 @@ static state states_78[3] = { }; static arc arcs_79_0[3] = { {26, 1}, + {35, 2}, {34, 2}, - {33, 2}, }; static arc arcs_79_1[3] = { - {165, 3}, - {31, 2}, + {166, 3}, + {32, 2}, {0, 1}, }; static arc arcs_79_2[1] = { @@ -1802,8 +1865,8 @@ static state states_79[4] = { {1, arcs_79_3}, }; static arc arcs_80_0[2] = { - {165, 1}, - {172, 1}, + {166, 1}, + {173, 1}, }; static arc arcs_80_1[1] = { {0, 1}, @@ -1813,19 +1876,19 @@ static state states_80[2] = { {1, arcs_80_1}, }; static arc arcs_81_0[1] = { - {101, 1}, + {102, 1}, }; static arc arcs_81_1[1] = { - {66, 2}, + {67, 2}, }; static arc arcs_81_2[1] = { - {102, 3}, + {103, 3}, }; static arc arcs_81_3[1] = { - {112, 4}, + {113, 4}, }; static arc arcs_81_4[2] = { - {171, 5}, + {172, 5}, {0, 4}, }; static arc arcs_81_5[1] = { @@ -1841,10 +1904,10 @@ static state states_81[6] = { }; static arc arcs_82_0[2] = { {21, 1}, - {173, 2}, + {174, 2}, }; static arc arcs_82_1[1] = { - {173, 2}, + {174, 2}, }; static arc arcs_82_2[1] = { {0, 2}, @@ -1855,13 +1918,13 @@ static state states_82[3] = { {1, arcs_82_2}, }; static arc arcs_83_0[1] = { - {97, 1}, + {98, 1}, }; static arc arcs_83_1[1] = { - {114, 2}, + {115, 2}, }; static arc arcs_83_2[2] = { - {171, 3}, + {172, 3}, {0, 2}, }; static arc arcs_83_3[1] = { @@ -1884,10 +1947,10 @@ static state states_84[2] = { {1, arcs_84_1}, }; static arc arcs_85_0[1] = { - {175, 1}, + {176, 1}, }; static arc arcs_85_1[2] = { - {176, 2}, + {177, 2}, {0, 1}, }; static arc arcs_85_2[1] = { @@ -1899,8 +1962,8 @@ static state states_85[3] = { {1, arcs_85_2}, }; static arc arcs_86_0[2] = { - {77, 1}, - {47, 2}, + {78, 1}, + {48, 2}, }; static arc arcs_86_1[1] = { {26, 2}, @@ -1913,13 +1976,115 @@ static state states_86[3] = { {1, arcs_86_1}, {1, arcs_86_2}, }; -static dfa dfas[87] = { +static arc arcs_87_0[1] = { + {179, 1}, +}; +static arc arcs_87_1[2] = { + {2, 1}, + {7, 2}, +}; +static arc arcs_87_2[1] = { + {0, 2}, +}; +static state states_87[3] = { + {1, arcs_87_0}, + {2, arcs_87_1}, + {1, arcs_87_2}, +}; +static arc arcs_88_0[1] = { + {13, 1}, +}; +static arc arcs_88_1[2] = { + {180, 2}, + {15, 3}, +}; +static arc arcs_88_2[1] = { + {15, 3}, +}; +static arc arcs_88_3[1] = { + {25, 4}, +}; +static arc arcs_88_4[1] = { + {26, 5}, +}; +static arc arcs_88_5[1] = { + {0, 5}, +}; +static state states_88[6] = { + {1, arcs_88_0}, + {2, arcs_88_1}, + {1, arcs_88_2}, + {1, arcs_88_3}, + {1, arcs_88_4}, + {1, arcs_88_5}, +}; +static arc arcs_89_0[3] = { + {26, 1}, + {34, 2}, + {35, 3}, +}; +static arc arcs_89_1[2] = { + {33, 4}, + {0, 1}, +}; +static arc arcs_89_2[3] = { + {26, 5}, + {33, 6}, + {0, 2}, +}; +static arc arcs_89_3[1] = { + {26, 7}, +}; +static arc arcs_89_4[4] = { + {26, 1}, + {34, 8}, + {35, 3}, + {0, 4}, +}; +static arc arcs_89_5[2] = { + {33, 6}, + {0, 5}, +}; +static arc arcs_89_6[2] = { + {26, 5}, + {35, 3}, +}; +static arc arcs_89_7[1] = { + {0, 7}, +}; +static arc arcs_89_8[3] = { + {26, 9}, + {33, 10}, + {0, 8}, +}; +static arc arcs_89_9[2] = { + {33, 10}, + {0, 9}, +}; +static arc arcs_89_10[2] = { + {26, 9}, + {35, 3}, +}; +static state states_89[11] = { + {3, arcs_89_0}, + {2, arcs_89_1}, + {3, arcs_89_2}, + {1, arcs_89_3}, + {4, arcs_89_4}, + {2, arcs_89_5}, + {2, arcs_89_6}, + {1, arcs_89_7}, + {3, arcs_89_8}, + {2, arcs_89_9}, + {2, arcs_89_10}, +}; +static dfa dfas[90] = { {256, "single_input", 0, 3, states_0, - "\004\050\340\000\002\000\000\000\012\076\011\007\262\004\020\002\000\300\220\050\037\202\000"}, + "\004\050\340\000\004\000\000\000\024\174\022\016\144\011\040\004\000\200\041\121\076\004\001"}, {257, "file_input", 0, 2, states_1, - "\204\050\340\000\002\000\000\000\012\076\011\007\262\004\020\002\000\300\220\050\037\202\000"}, + "\204\050\340\000\004\000\000\000\024\174\022\016\144\011\040\004\000\200\041\121\076\004\001"}, {258, "eval_input", 0, 3, states_2, - "\000\040\200\000\000\000\000\000\000\000\010\000\000\000\020\002\000\300\220\050\037\000\000"}, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, {259, "decorator", 0, 7, states_3, "\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {260, "decorators", 0, 2, states_4, @@ -1928,54 +2093,54 @@ static dfa dfas[87] = { "\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {262, "async_funcdef", 0, 3, states_6, "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {263, "funcdef", 0, 8, states_7, + {263, "funcdef", 0, 9, states_7, "\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {264, "parameters", 0, 4, states_8, "\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {265, "typedargslist", 0, 19, states_9, - "\000\000\200\000\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + {265, "typedargslist", 0, 23, states_9, + "\000\000\200\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {266, "tfpdef", 0, 4, states_10, "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {267, "varargslist", 0, 19, states_11, - "\000\000\200\000\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\200\000\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {268, "vfpdef", 0, 2, states_12, "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {269, "stmt", 0, 2, states_13, - "\000\050\340\000\002\000\000\000\012\076\011\007\262\004\020\002\000\300\220\050\037\202\000"}, + "\000\050\340\000\004\000\000\000\024\174\022\016\144\011\040\004\000\200\041\121\076\004\001"}, {270, "simple_stmt", 0, 4, states_14, - "\000\040\200\000\002\000\000\000\012\076\011\007\000\000\020\002\000\300\220\050\037\200\000"}, + "\000\040\200\000\004\000\000\000\024\174\022\016\000\000\040\004\000\200\041\121\076\000\001"}, {271, "small_stmt", 0, 2, states_15, - "\000\040\200\000\002\000\000\000\012\076\011\007\000\000\020\002\000\300\220\050\037\200\000"}, + "\000\040\200\000\004\000\000\000\024\174\022\016\000\000\040\004\000\200\041\121\076\000\001"}, {272, "expr_stmt", 0, 6, states_16, - "\000\040\200\000\002\000\000\000\000\000\010\000\000\000\020\002\000\300\220\050\037\000\000"}, + "\000\040\200\000\004\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, {273, "annassign", 0, 5, states_17, "\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {274, "testlist_star_expr", 0, 3, states_18, - "\000\040\200\000\002\000\000\000\000\000\010\000\000\000\020\002\000\300\220\050\037\000\000"}, + "\000\040\200\000\004\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, {275, "augassign", 0, 2, states_19, - "\000\000\000\000\000\000\360\377\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\340\377\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {276, "del_stmt", 0, 3, states_20, - "\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {277, "pass_stmt", 0, 2, states_21, - "\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {278, "flow_stmt", 0, 2, states_22, - "\000\000\000\000\000\000\000\000\000\036\000\000\000\000\000\000\000\000\000\000\000\200\000"}, + "\000\000\000\000\000\000\000\000\000\074\000\000\000\000\000\000\000\000\000\000\000\000\001"}, {279, "break_stmt", 0, 2, states_23, - "\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {280, "continue_stmt", 0, 2, states_24, "\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {281, "return_stmt", 0, 3, states_25, + {280, "continue_stmt", 0, 2, states_24, "\000\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + {281, "return_stmt", 0, 3, states_25, + "\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {282, "yield_stmt", 0, 2, states_26, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001"}, {283, "raise_stmt", 0, 5, states_27, - "\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {284, "import_stmt", 0, 2, states_28, - "\000\000\000\000\000\000\000\000\000\040\001\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\100\002\000\000\000\000\000\000\000\000\000\000\000\000"}, {285, "import_name", 0, 3, states_29, - "\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000"}, {286, "import_from", 0, 8, states_30, - "\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {287, "import_as_name", 0, 4, states_31, "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {288, "dotted_as_name", 0, 4, states_32, @@ -1987,109 +2152,115 @@ static dfa dfas[87] = { {291, "dotted_name", 0, 2, states_35, "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {292, "global_stmt", 0, 3, states_36, - "\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000"}, - {293, "nonlocal_stmt", 0, 3, states_37, "\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000"}, - {294, "assert_stmt", 0, 5, states_38, + {293, "nonlocal_stmt", 0, 3, states_37, "\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000"}, + {294, "assert_stmt", 0, 5, states_38, + "\000\000\000\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000"}, {295, "compound_stmt", 0, 2, states_39, - "\000\010\140\000\000\000\000\000\000\000\000\000\262\004\000\000\000\000\000\000\000\002\000"}, + "\000\010\140\000\000\000\000\000\000\000\000\000\144\011\000\000\000\000\000\000\000\004\000"}, {296, "async_stmt", 0, 3, states_40, "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {297, "if_stmt", 0, 8, states_41, - "\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000"}, {298, "while_stmt", 0, 8, states_42, - "\000\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000"}, - {299, "for_stmt", 0, 10, states_43, "\000\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000"}, + {299, "for_stmt", 0, 11, states_43, + "\000\000\000\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000"}, {300, "try_stmt", 0, 13, states_44, - "\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000"}, - {301, "with_stmt", 0, 5, states_45, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000"}, + {301, "with_stmt", 0, 6, states_45, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000"}, {302, "with_item", 0, 4, states_46, - "\000\040\200\000\000\000\000\000\000\000\010\000\000\000\020\002\000\300\220\050\037\000\000"}, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, {303, "except_clause", 0, 5, states_47, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000"}, - {304, "suite", 0, 5, states_48, - "\004\040\200\000\002\000\000\000\012\076\011\007\000\000\020\002\000\300\220\050\037\200\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000"}, + {304, "suite", 0, 7, states_48, + "\004\040\200\000\004\000\000\000\024\174\022\016\000\000\040\004\000\200\041\121\076\000\001"}, {305, "test", 0, 6, states_49, - "\000\040\200\000\000\000\000\000\000\000\010\000\000\000\020\002\000\300\220\050\037\000\000"}, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, {306, "test_nocond", 0, 2, states_50, - "\000\040\200\000\000\000\000\000\000\000\010\000\000\000\020\002\000\300\220\050\037\000\000"}, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, {307, "lambdef", 0, 5, states_51, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000"}, {308, "lambdef_nocond", 0, 5, states_52, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000"}, {309, "or_test", 0, 2, states_53, - "\000\040\200\000\000\000\000\000\000\000\010\000\000\000\000\002\000\300\220\050\037\000\000"}, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\004\000\200\041\121\076\000\000"}, {310, "and_test", 0, 2, states_54, - "\000\040\200\000\000\000\000\000\000\000\010\000\000\000\000\002\000\300\220\050\037\000\000"}, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\004\000\200\041\121\076\000\000"}, {311, "not_test", 0, 3, states_55, - "\000\040\200\000\000\000\000\000\000\000\010\000\000\000\000\002\000\300\220\050\037\000\000"}, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\004\000\200\041\121\076\000\000"}, {312, "comparison", 0, 2, states_56, - "\000\040\200\000\000\000\000\000\000\000\010\000\000\000\000\000\000\300\220\050\037\000\000"}, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\200\041\121\076\000\000"}, {313, "comp_op", 0, 4, states_57, - "\000\000\000\000\000\000\000\000\000\000\000\000\100\000\000\362\017\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\344\037\000\000\000\000\000\000"}, {314, "star_expr", 0, 3, states_58, - "\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {315, "expr", 0, 2, states_59, - "\000\040\200\000\000\000\000\000\000\000\010\000\000\000\000\000\000\300\220\050\037\000\000"}, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\200\041\121\076\000\000"}, {316, "xor_expr", 0, 2, states_60, - "\000\040\200\000\000\000\000\000\000\000\010\000\000\000\000\000\000\300\220\050\037\000\000"}, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\200\041\121\076\000\000"}, {317, "and_expr", 0, 2, states_61, - "\000\040\200\000\000\000\000\000\000\000\010\000\000\000\000\000\000\300\220\050\037\000\000"}, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\200\041\121\076\000\000"}, {318, "shift_expr", 0, 2, states_62, - "\000\040\200\000\000\000\000\000\000\000\010\000\000\000\000\000\000\300\220\050\037\000\000"}, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\200\041\121\076\000\000"}, {319, "arith_expr", 0, 2, states_63, - "\000\040\200\000\000\000\000\000\000\000\010\000\000\000\000\000\000\300\220\050\037\000\000"}, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\200\041\121\076\000\000"}, {320, "term", 0, 2, states_64, - "\000\040\200\000\000\000\000\000\000\000\010\000\000\000\000\000\000\300\220\050\037\000\000"}, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\200\041\121\076\000\000"}, {321, "factor", 0, 3, states_65, - "\000\040\200\000\000\000\000\000\000\000\010\000\000\000\000\000\000\300\220\050\037\000\000"}, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\200\041\121\076\000\000"}, {322, "power", 0, 4, states_66, - "\000\040\200\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\200\050\037\000\000"}, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\121\076\000\000"}, {323, "atom_expr", 0, 3, states_67, - "\000\040\200\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\200\050\037\000\000"}, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\121\076\000\000"}, {324, "atom", 0, 9, states_68, - "\000\040\200\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\050\037\000\000"}, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\120\076\000\000"}, {325, "testlist_comp", 0, 5, states_69, - "\000\040\200\000\002\000\000\000\000\000\010\000\000\000\020\002\000\300\220\050\037\000\000"}, + "\000\040\200\000\004\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, {326, "trailer", 0, 7, states_70, - "\000\040\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\010\000\000\000"}, + "\000\040\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\020\000\000\000"}, {327, "subscriptlist", 0, 3, states_71, - "\000\040\200\010\000\000\000\000\000\000\010\000\000\000\020\002\000\300\220\050\037\000\000"}, + "\000\040\200\010\000\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, {328, "subscript", 0, 5, states_72, - "\000\040\200\010\000\000\000\000\000\000\010\000\000\000\020\002\000\300\220\050\037\000\000"}, + "\000\040\200\010\000\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, {329, "sliceop", 0, 3, states_73, "\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {330, "exprlist", 0, 3, states_74, - "\000\040\200\000\002\000\000\000\000\000\010\000\000\000\000\000\000\300\220\050\037\000\000"}, + "\000\040\200\000\004\000\000\000\000\000\020\000\000\000\000\000\000\200\041\121\076\000\000"}, {331, "testlist", 0, 3, states_75, - "\000\040\200\000\000\000\000\000\000\000\010\000\000\000\020\002\000\300\220\050\037\000\000"}, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, {332, "dictorsetmaker", 0, 14, states_76, - "\000\040\200\000\006\000\000\000\000\000\010\000\000\000\020\002\000\300\220\050\037\000\000"}, + "\000\040\200\000\014\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, {333, "classdef", 0, 8, states_77, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000"}, {334, "arglist", 0, 3, states_78, - "\000\040\200\000\006\000\000\000\000\000\010\000\000\000\020\002\000\300\220\050\037\000\000"}, + "\000\040\200\000\014\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, {335, "argument", 0, 4, states_79, - "\000\040\200\000\006\000\000\000\000\000\010\000\000\000\020\002\000\300\220\050\037\000\000"}, + "\000\040\200\000\014\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, {336, "comp_iter", 0, 2, states_80, - "\000\000\040\000\000\000\000\000\000\000\000\000\042\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\040\000\000\000\000\000\000\000\000\000\104\000\000\000\000\000\000\000\000\000\000"}, {337, "sync_comp_for", 0, 6, states_81, - "\000\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000"}, {338, "comp_for", 0, 3, states_82, - "\000\000\040\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\040\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000"}, {339, "comp_if", 0, 4, states_83, - "\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000"}, {340, "encoding_decl", 0, 2, states_84, "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {341, "yield_expr", 0, 3, states_85, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001"}, {342, "yield_arg", 0, 3, states_86, - "\000\040\200\000\002\000\000\000\000\040\010\000\000\000\020\002\000\300\220\050\037\000\000"}, + "\000\040\200\000\004\000\000\000\000\100\020\000\000\000\040\004\000\200\041\121\076\000\000"}, + {343, "func_type_input", 0, 3, states_87, + "\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + {344, "func_type", 0, 6, states_88, + "\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + {345, "typelist", 0, 11, states_89, + "\000\040\200\000\014\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, }; -static label labels[177] = { +static label labels[181] = { {0, "EMPTY"}, {256, 0}, {4, 0}, @@ -2118,6 +2289,7 @@ static label labels[177] = { {51, 0}, {305, 0}, {11, 0}, + {55, 0}, {304, 0}, {265, 0}, {266, 0}, @@ -2267,10 +2439,13 @@ static label labels[177] = { {340, 0}, {1, "yield"}, {342, 0}, + {343, 0}, + {344, 0}, + {345, 0}, }; grammar _PyParser_Grammar = { - 87, + 90, dfas, - {177, labels}, + {181, labels}, 256 }; From 9db5e34be2ef1f71e3848395ffaa5ef2240ca38e Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Sat, 19 Jan 2019 10:24:44 -0800 Subject: [PATCH 07/46] Add type_comment fields to various asdl classes without regenerating anything --- Parser/Python.asdl | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/Parser/Python.asdl b/Parser/Python.asdl index cedf37a2d9f9ee..df3d4b2bd6eebc 100644 --- a/Parser/Python.asdl +++ b/Parser/Python.asdl @@ -3,17 +3,20 @@ module Python { - mod = Module(stmt* body) + mod = Module(stmt* body, type_ignore *type_ignores) | Interactive(stmt* body) | Expression(expr body) + | FunctionType(expr* argtypes, expr returns) -- not really an actual node but useful in Jython's typesystem. | Suite(stmt* body) stmt = FunctionDef(identifier name, arguments args, - stmt* body, expr* decorator_list, expr? returns) + stmt* body, expr* decorator_list, expr? returns, + string? type_comment) | AsyncFunctionDef(identifier name, arguments args, - stmt* body, expr* decorator_list, expr? returns) + stmt* body, expr* decorator_list, expr? returns, + string? type_comment) | ClassDef(identifier name, expr* bases, @@ -23,18 +26,18 @@ module Python | Return(expr? value) | Delete(expr* targets) - | Assign(expr* targets, expr value) + | Assign(expr* targets, expr value, string? type_comment) | AugAssign(expr target, operator op, expr value) -- 'simple' indicates that we annotate simple name without parens | AnnAssign(expr target, expr annotation, expr? value, int simple) -- use 'orelse' because else is a keyword in target languages - | For(expr target, expr iter, stmt* body, stmt* orelse) - | AsyncFor(expr target, expr iter, stmt* body, stmt* orelse) + | For(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment) + | AsyncFor(expr target, expr iter, stmt* body, stmt* orelse, string? type_comment) | While(expr test, stmt* body, stmt* orelse) | If(expr test, stmt* body, stmt* orelse) - | With(withitem* items, stmt* body) - | AsyncWith(withitem* items, stmt* body) + | With(withitem* items, stmt* body, string? type_comment) + | AsyncWith(withitem* items, stmt* body, string? type_comment) | Raise(expr? exc, expr? cause) | Try(stmt* body, excepthandler* handlers, stmt* orelse, stmt* finalbody) @@ -110,7 +113,7 @@ module Python arguments = (arg* args, arg? vararg, arg* kwonlyargs, expr* kw_defaults, arg? kwarg, expr* defaults) - arg = (identifier arg, expr? annotation) + arg = (identifier arg, expr? annotation, string? type_comment) attributes (int lineno, int col_offset, int? end_lineno, int? end_col_offset) -- keyword arguments supplied to call (NULL identifier for **kwargs) @@ -120,5 +123,7 @@ module Python alias = (identifier name, identifier? asname) withitem = (expr context_expr, expr? optional_vars) + + type_ignore = TypeIgnore(int lineno) } From 6cc5a55306545238f4f989c9d2451c2fb1a576bb Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Sat, 19 Jan 2019 10:33:56 -0800 Subject: [PATCH 08/46] Regenerated files (make regen-ast) --- Include/Python-ast.h | 94 +++++--- Parser/asdl_c.py | 9 + Python/Python-ast.c | 505 +++++++++++++++++++++++++++++++++++++++---- 3 files changed, 534 insertions(+), 74 deletions(-) diff --git a/Include/Python-ast.h b/Include/Python-ast.h index f8394e6c26ad83..8811b1e38ae759 100644 --- a/Include/Python-ast.h +++ b/Include/Python-ast.h @@ -46,14 +46,17 @@ typedef struct _alias *alias_ty; typedef struct _withitem *withitem_ty; +typedef struct _type_ignore *type_ignore_ty; + enum _mod_kind {Module_kind=1, Interactive_kind=2, Expression_kind=3, - Suite_kind=4}; + FunctionType_kind=4, Suite_kind=5}; struct _mod { enum _mod_kind kind; union { struct { asdl_seq *body; + asdl_seq *type_ignores; } Module; struct { @@ -64,6 +67,11 @@ struct _mod { expr_ty body; } Expression; + struct { + asdl_seq *argtypes; + expr_ty returns; + } FunctionType; + struct { asdl_seq *body; } Suite; @@ -88,6 +96,7 @@ struct _stmt { asdl_seq *body; asdl_seq *decorator_list; expr_ty returns; + string type_comment; } FunctionDef; struct { @@ -96,6 +105,7 @@ struct _stmt { asdl_seq *body; asdl_seq *decorator_list; expr_ty returns; + string type_comment; } AsyncFunctionDef; struct { @@ -117,6 +127,7 @@ struct _stmt { struct { asdl_seq *targets; expr_ty value; + string type_comment; } Assign; struct { @@ -137,6 +148,7 @@ struct _stmt { expr_ty iter; asdl_seq *body; asdl_seq *orelse; + string type_comment; } For; struct { @@ -144,6 +156,7 @@ struct _stmt { expr_ty iter; asdl_seq *body; asdl_seq *orelse; + string type_comment; } AsyncFor; struct { @@ -161,11 +174,13 @@ struct _stmt { struct { asdl_seq *items; asdl_seq *body; + string type_comment; } With; struct { asdl_seq *items; asdl_seq *body; + string type_comment; } AsyncWith; struct { @@ -416,6 +431,7 @@ struct _arguments { struct _arg { identifier arg; expr_ty annotation; + string type_comment; int lineno; int col_offset; int end_lineno; @@ -437,26 +453,40 @@ struct _withitem { expr_ty optional_vars; }; +enum _type_ignore_kind {TypeIgnore_kind=1}; +struct _type_ignore { + enum _type_ignore_kind kind; + union { + struct { + int lineno; + } TypeIgnore; + + } v; +}; + // Note: these macros affect function definitions, not only call sites. -#define Module(a0, a1) _Py_Module(a0, a1) -mod_ty _Py_Module(asdl_seq * body, PyArena *arena); +#define Module(a0, a1, a2) _Py_Module(a0, a1, a2) +mod_ty _Py_Module(asdl_seq * body, asdl_seq * type_ignores, PyArena *arena); #define Interactive(a0, a1) _Py_Interactive(a0, a1) mod_ty _Py_Interactive(asdl_seq * body, PyArena *arena); #define Expression(a0, a1) _Py_Expression(a0, a1) mod_ty _Py_Expression(expr_ty body, PyArena *arena); +#define FunctionType(a0, a1, a2) _Py_FunctionType(a0, a1, a2) +mod_ty _Py_FunctionType(asdl_seq * argtypes, expr_ty returns, PyArena *arena); #define Suite(a0, a1) _Py_Suite(a0, a1) mod_ty _Py_Suite(asdl_seq * body, PyArena *arena); -#define FunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) _Py_FunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) +#define FunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) _Py_FunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) stmt_ty _Py_FunctionDef(identifier name, arguments_ty args, asdl_seq * body, - asdl_seq * decorator_list, expr_ty returns, int lineno, - int col_offset, int end_lineno, int end_col_offset, - PyArena *arena); -#define AsyncFunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) _Py_AsyncFunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) + asdl_seq * decorator_list, expr_ty returns, string + type_comment, int lineno, int col_offset, int + end_lineno, int end_col_offset, PyArena *arena); +#define AsyncFunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) _Py_AsyncFunctionDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) stmt_ty _Py_AsyncFunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq * decorator_list, expr_ty returns, - int lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena); + string type_comment, int lineno, int col_offset, + int end_lineno, int end_col_offset, PyArena + *arena); #define ClassDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) _Py_ClassDef(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) stmt_ty _Py_ClassDef(identifier name, asdl_seq * bases, asdl_seq * keywords, asdl_seq * body, asdl_seq * decorator_list, int lineno, @@ -468,10 +498,10 @@ stmt_ty _Py_Return(expr_ty value, int lineno, int col_offset, int end_lineno, #define Delete(a0, a1, a2, a3, a4, a5) _Py_Delete(a0, a1, a2, a3, a4, a5) stmt_ty _Py_Delete(asdl_seq * targets, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); -#define Assign(a0, a1, a2, a3, a4, a5, a6) _Py_Assign(a0, a1, a2, a3, a4, a5, a6) -stmt_ty _Py_Assign(asdl_seq * targets, expr_ty value, int lineno, int - col_offset, int end_lineno, int end_col_offset, PyArena - *arena); +#define Assign(a0, a1, a2, a3, a4, a5, a6, a7) _Py_Assign(a0, a1, a2, a3, a4, a5, a6, a7) +stmt_ty _Py_Assign(asdl_seq * targets, expr_ty value, string type_comment, int + lineno, int col_offset, int end_lineno, int end_col_offset, + PyArena *arena); #define AugAssign(a0, a1, a2, a3, a4, a5, a6, a7) _Py_AugAssign(a0, a1, a2, a3, a4, a5, a6, a7) stmt_ty _Py_AugAssign(expr_ty target, operator_ty op, expr_ty value, int lineno, int col_offset, int end_lineno, int @@ -480,14 +510,14 @@ stmt_ty _Py_AugAssign(expr_ty target, operator_ty op, expr_ty value, int stmt_ty _Py_AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int simple, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); -#define For(a0, a1, a2, a3, a4, a5, a6, a7, a8) _Py_For(a0, a1, a2, a3, a4, a5, a6, a7, a8) +#define For(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) _Py_For(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) stmt_ty _Py_For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * - orelse, int lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena); -#define AsyncFor(a0, a1, a2, a3, a4, a5, a6, a7, a8) _Py_AsyncFor(a0, a1, a2, a3, a4, a5, a6, a7, a8) + orelse, string type_comment, int lineno, int col_offset, int + end_lineno, int end_col_offset, PyArena *arena); +#define AsyncFor(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) _Py_AsyncFor(a0, a1, a2, a3, a4, a5, a6, a7, a8, a9) stmt_ty _Py_AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * - orelse, int lineno, int col_offset, int end_lineno, int - end_col_offset, PyArena *arena); + orelse, string type_comment, int lineno, int col_offset, + int end_lineno, int end_col_offset, PyArena *arena); #define While(a0, a1, a2, a3, a4, a5, a6, a7) _Py_While(a0, a1, a2, a3, a4, a5, a6, a7) stmt_ty _Py_While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena @@ -496,13 +526,14 @@ stmt_ty _Py_While(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, stmt_ty _Py_If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); -#define With(a0, a1, a2, a3, a4, a5, a6) _Py_With(a0, a1, a2, a3, a4, a5, a6) -stmt_ty _Py_With(asdl_seq * items, asdl_seq * body, int lineno, int col_offset, - int end_lineno, int end_col_offset, PyArena *arena); -#define AsyncWith(a0, a1, a2, a3, a4, a5, a6) _Py_AsyncWith(a0, a1, a2, a3, a4, a5, a6) -stmt_ty _Py_AsyncWith(asdl_seq * items, asdl_seq * body, int lineno, int - col_offset, int end_lineno, int end_col_offset, PyArena - *arena); +#define With(a0, a1, a2, a3, a4, a5, a6, a7) _Py_With(a0, a1, a2, a3, a4, a5, a6, a7) +stmt_ty _Py_With(asdl_seq * items, asdl_seq * body, string type_comment, int + lineno, int col_offset, int end_lineno, int end_col_offset, + PyArena *arena); +#define AsyncWith(a0, a1, a2, a3, a4, a5, a6, a7) _Py_AsyncWith(a0, a1, a2, a3, a4, a5, a6, a7) +stmt_ty _Py_AsyncWith(asdl_seq * items, asdl_seq * body, string type_comment, + int lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena); #define Raise(a0, a1, a2, a3, a4, a5, a6) _Py_Raise(a0, a1, a2, a3, a4, a5, a6) stmt_ty _Py_Raise(expr_ty exc, expr_ty cause, int lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena); @@ -647,9 +678,10 @@ excepthandler_ty _Py_ExceptHandler(expr_ty type, identifier name, asdl_seq * arguments_ty _Py_arguments(asdl_seq * args, arg_ty vararg, asdl_seq * kwonlyargs, asdl_seq * kw_defaults, arg_ty kwarg, asdl_seq * defaults, PyArena *arena); -#define arg(a0, a1, a2, a3, a4, a5, a6) _Py_arg(a0, a1, a2, a3, a4, a5, a6) -arg_ty _Py_arg(identifier arg, expr_ty annotation, int lineno, int col_offset, - int end_lineno, int end_col_offset, PyArena *arena); +#define arg(a0, a1, a2, a3, a4, a5, a6, a7) _Py_arg(a0, a1, a2, a3, a4, a5, a6, a7) +arg_ty _Py_arg(identifier arg, expr_ty annotation, string type_comment, int + lineno, int col_offset, int end_lineno, int end_col_offset, + PyArena *arena); #define keyword(a0, a1, a2) _Py_keyword(a0, a1, a2) keyword_ty _Py_keyword(identifier arg, expr_ty value, PyArena *arena); #define alias(a0, a1, a2) _Py_alias(a0, a1, a2) @@ -657,6 +689,8 @@ alias_ty _Py_alias(identifier name, identifier asname, PyArena *arena); #define withitem(a0, a1, a2) _Py_withitem(a0, a1, a2) withitem_ty _Py_withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena); +#define TypeIgnore(a0, a1) _Py_TypeIgnore(a0, a1) +type_ignore_ty _Py_TypeIgnore(int lineno, PyArena *arena); PyObject* PyAST_mod2obj(mod_ty t); mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode); diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 8640b29b8f10b6..6c538b751d2f00 100644 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -890,6 +890,15 @@ def visitModule(self, mod): return obj2ast_object(obj, out, arena); } +static int obj2ast_string(PyObject* obj, PyObject** out, PyArena* arena) +{ + if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) { + PyErr_SetString(PyExc_TypeError, "AST string must be of type str"); + return 1; + } + return obj2ast_object(obj, out, arena); +} + static int obj2ast_int(PyObject* obj, int* out, PyArena* arena) { int i; diff --git a/Python/Python-ast.c b/Python/Python-ast.c index e6c5bfe9b29e00..41fed00d5cd4c1 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -10,8 +10,10 @@ static PyTypeObject *mod_type; static PyObject* ast2obj_mod(void*); static PyTypeObject *Module_type; _Py_IDENTIFIER(body); +_Py_IDENTIFIER(type_ignores); static char *Module_fields[]={ "body", + "type_ignores", }; static PyTypeObject *Interactive_type; static char *Interactive_fields[]={ @@ -21,6 +23,13 @@ static PyTypeObject *Expression_type; static char *Expression_fields[]={ "body", }; +static PyTypeObject *FunctionType_type; +_Py_IDENTIFIER(argtypes); +_Py_IDENTIFIER(returns); +static char *FunctionType_fields[]={ + "argtypes", + "returns", +}; static PyTypeObject *Suite_type; static char *Suite_fields[]={ "body", @@ -41,13 +50,14 @@ static PyTypeObject *FunctionDef_type; _Py_IDENTIFIER(name); _Py_IDENTIFIER(args); _Py_IDENTIFIER(decorator_list); -_Py_IDENTIFIER(returns); +_Py_IDENTIFIER(type_comment); static char *FunctionDef_fields[]={ "name", "args", "body", "decorator_list", "returns", + "type_comment", }; static PyTypeObject *AsyncFunctionDef_type; static char *AsyncFunctionDef_fields[]={ @@ -56,6 +66,7 @@ static char *AsyncFunctionDef_fields[]={ "body", "decorator_list", "returns", + "type_comment", }; static PyTypeObject *ClassDef_type; _Py_IDENTIFIER(bases); @@ -81,6 +92,7 @@ static PyTypeObject *Assign_type; static char *Assign_fields[]={ "targets", "value", + "type_comment", }; static PyTypeObject *AugAssign_type; _Py_IDENTIFIER(target); @@ -107,6 +119,7 @@ static char *For_fields[]={ "iter", "body", "orelse", + "type_comment", }; static PyTypeObject *AsyncFor_type; static char *AsyncFor_fields[]={ @@ -114,6 +127,7 @@ static char *AsyncFor_fields[]={ "iter", "body", "orelse", + "type_comment", }; static PyTypeObject *While_type; _Py_IDENTIFIER(test); @@ -133,11 +147,13 @@ _Py_IDENTIFIER(items); static char *With_fields[]={ "items", "body", + "type_comment", }; static PyTypeObject *AsyncWith_type; static char *AsyncWith_fields[]={ "items", "body", + "type_comment", }; static PyTypeObject *Raise_type; _Py_IDENTIFIER(exc); @@ -471,6 +487,7 @@ _Py_IDENTIFIER(arg); static char *arg_fields[]={ "arg", "annotation", + "type_comment", }; static PyTypeObject *keyword_type; static PyObject* ast2obj_keyword(void*); @@ -493,6 +510,12 @@ static char *withitem_fields[]={ "context_expr", "optional_vars", }; +static PyTypeObject *type_ignore_type; +static PyObject* ast2obj_type_ignore(void*); +static PyTypeObject *TypeIgnore_type; +static char *TypeIgnore_fields[]={ + "lineno", +}; _Py_IDENTIFIER(_fields); @@ -762,6 +785,15 @@ static int obj2ast_identifier(PyObject* obj, PyObject** out, PyArena* arena) return obj2ast_object(obj, out, arena); } +static int obj2ast_string(PyObject* obj, PyObject** out, PyArena* arena) +{ + if (!PyUnicode_CheckExact(obj) && !PyBytes_CheckExact(obj)) { + PyErr_SetString(PyExc_TypeError, "AST string must be of type str"); + return 1; + } + return obj2ast_object(obj, out, arena); +} + static int obj2ast_int(PyObject* obj, int* out, PyArena* arena) { int i; @@ -803,23 +835,26 @@ static int init_types(void) mod_type = make_type("mod", &AST_type, NULL, 0); if (!mod_type) return 0; if (!add_attributes(mod_type, NULL, 0)) return 0; - Module_type = make_type("Module", mod_type, Module_fields, 1); + Module_type = make_type("Module", mod_type, Module_fields, 2); if (!Module_type) return 0; Interactive_type = make_type("Interactive", mod_type, Interactive_fields, 1); if (!Interactive_type) return 0; Expression_type = make_type("Expression", mod_type, Expression_fields, 1); if (!Expression_type) return 0; + FunctionType_type = make_type("FunctionType", mod_type, + FunctionType_fields, 2); + if (!FunctionType_type) return 0; Suite_type = make_type("Suite", mod_type, Suite_fields, 1); if (!Suite_type) return 0; stmt_type = make_type("stmt", &AST_type, NULL, 0); if (!stmt_type) return 0; if (!add_attributes(stmt_type, stmt_attributes, 4)) return 0; FunctionDef_type = make_type("FunctionDef", stmt_type, FunctionDef_fields, - 5); + 6); if (!FunctionDef_type) return 0; AsyncFunctionDef_type = make_type("AsyncFunctionDef", stmt_type, - AsyncFunctionDef_fields, 5); + AsyncFunctionDef_fields, 6); if (!AsyncFunctionDef_type) return 0; ClassDef_type = make_type("ClassDef", stmt_type, ClassDef_fields, 5); if (!ClassDef_type) return 0; @@ -827,23 +862,23 @@ static int init_types(void) if (!Return_type) return 0; Delete_type = make_type("Delete", stmt_type, Delete_fields, 1); if (!Delete_type) return 0; - Assign_type = make_type("Assign", stmt_type, Assign_fields, 2); + Assign_type = make_type("Assign", stmt_type, Assign_fields, 3); if (!Assign_type) return 0; AugAssign_type = make_type("AugAssign", stmt_type, AugAssign_fields, 3); if (!AugAssign_type) return 0; AnnAssign_type = make_type("AnnAssign", stmt_type, AnnAssign_fields, 4); if (!AnnAssign_type) return 0; - For_type = make_type("For", stmt_type, For_fields, 4); + For_type = make_type("For", stmt_type, For_fields, 5); if (!For_type) return 0; - AsyncFor_type = make_type("AsyncFor", stmt_type, AsyncFor_fields, 4); + AsyncFor_type = make_type("AsyncFor", stmt_type, AsyncFor_fields, 5); if (!AsyncFor_type) return 0; While_type = make_type("While", stmt_type, While_fields, 3); if (!While_type) return 0; If_type = make_type("If", stmt_type, If_fields, 3); if (!If_type) return 0; - With_type = make_type("With", stmt_type, With_fields, 2); + With_type = make_type("With", stmt_type, With_fields, 3); if (!With_type) return 0; - AsyncWith_type = make_type("AsyncWith", stmt_type, AsyncWith_fields, 2); + AsyncWith_type = make_type("AsyncWith", stmt_type, AsyncWith_fields, 3); if (!AsyncWith_type) return 0; Raise_type = make_type("Raise", stmt_type, Raise_fields, 2); if (!Raise_type) return 0; @@ -1100,7 +1135,7 @@ static int init_types(void) arguments_type = make_type("arguments", &AST_type, arguments_fields, 6); if (!arguments_type) return 0; if (!add_attributes(arguments_type, NULL, 0)) return 0; - arg_type = make_type("arg", &AST_type, arg_fields, 2); + arg_type = make_type("arg", &AST_type, arg_fields, 3); if (!arg_type) return 0; if (!add_attributes(arg_type, arg_attributes, 4)) return 0; keyword_type = make_type("keyword", &AST_type, keyword_fields, 2); @@ -1112,6 +1147,12 @@ static int init_types(void) withitem_type = make_type("withitem", &AST_type, withitem_fields, 2); if (!withitem_type) return 0; if (!add_attributes(withitem_type, NULL, 0)) return 0; + type_ignore_type = make_type("type_ignore", &AST_type, NULL, 0); + if (!type_ignore_type) return 0; + if (!add_attributes(type_ignore_type, NULL, 0)) return 0; + TypeIgnore_type = make_type("TypeIgnore", type_ignore_type, + TypeIgnore_fields, 1); + if (!TypeIgnore_type) return 0; initialized = 1; return 1; } @@ -1135,9 +1176,11 @@ static int obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena); static int obj2ast_keyword(PyObject* obj, keyword_ty* out, PyArena* arena); static int obj2ast_alias(PyObject* obj, alias_ty* out, PyArena* arena); static int obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena); +static int obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena* + arena); mod_ty -Module(asdl_seq * body, PyArena *arena) +Module(asdl_seq * body, asdl_seq * type_ignores, PyArena *arena) { mod_ty p; p = (mod_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1145,6 +1188,7 @@ Module(asdl_seq * body, PyArena *arena) return NULL; p->kind = Module_kind; p->v.Module.body = body; + p->v.Module.type_ignores = type_ignores; return p; } @@ -1177,6 +1221,24 @@ Expression(expr_ty body, PyArena *arena) return p; } +mod_ty +FunctionType(asdl_seq * argtypes, expr_ty returns, PyArena *arena) +{ + mod_ty p; + if (!returns) { + PyErr_SetString(PyExc_ValueError, + "field returns is required for FunctionType"); + return NULL; + } + p = (mod_ty)PyArena_Malloc(arena, sizeof(*p)); + if (!p) + return NULL; + p->kind = FunctionType_kind; + p->v.FunctionType.argtypes = argtypes; + p->v.FunctionType.returns = returns; + return p; +} + mod_ty Suite(asdl_seq * body, PyArena *arena) { @@ -1191,8 +1253,8 @@ Suite(asdl_seq * body, PyArena *arena) stmt_ty FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq * - decorator_list, expr_ty returns, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena) + decorator_list, expr_ty returns, string type_comment, int lineno, + int col_offset, int end_lineno, int end_col_offset, PyArena *arena) { stmt_ty p; if (!name) { @@ -1214,6 +1276,7 @@ FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq * p->v.FunctionDef.body = body; p->v.FunctionDef.decorator_list = decorator_list; p->v.FunctionDef.returns = returns; + p->v.FunctionDef.type_comment = type_comment; p->lineno = lineno; p->col_offset = col_offset; p->end_lineno = end_lineno; @@ -1223,8 +1286,9 @@ FunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq * stmt_ty AsyncFunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq - * decorator_list, expr_ty returns, int lineno, int col_offset, - int end_lineno, int end_col_offset, PyArena *arena) + * decorator_list, expr_ty returns, string type_comment, int + lineno, int col_offset, int end_lineno, int end_col_offset, + PyArena *arena) { stmt_ty p; if (!name) { @@ -1246,6 +1310,7 @@ AsyncFunctionDef(identifier name, arguments_ty args, asdl_seq * body, asdl_seq p->v.AsyncFunctionDef.body = body; p->v.AsyncFunctionDef.decorator_list = decorator_list; p->v.AsyncFunctionDef.returns = returns; + p->v.AsyncFunctionDef.type_comment = type_comment; p->lineno = lineno; p->col_offset = col_offset; p->end_lineno = end_lineno; @@ -1315,8 +1380,8 @@ Delete(asdl_seq * targets, int lineno, int col_offset, int end_lineno, int } stmt_ty -Assign(asdl_seq * targets, expr_ty value, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena) +Assign(asdl_seq * targets, expr_ty value, string type_comment, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena *arena) { stmt_ty p; if (!value) { @@ -1330,6 +1395,7 @@ Assign(asdl_seq * targets, expr_ty value, int lineno, int col_offset, int p->kind = Assign_kind; p->v.Assign.targets = targets; p->v.Assign.value = value; + p->v.Assign.type_comment = type_comment; p->lineno = lineno; p->col_offset = col_offset; p->end_lineno = end_lineno; @@ -1403,8 +1469,9 @@ AnnAssign(expr_ty target, expr_ty annotation, expr_ty value, int simple, int } stmt_ty -For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int - lineno, int col_offset, int end_lineno, int end_col_offset, PyArena *arena) +For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, string + type_comment, int lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena) { stmt_ty p; if (!target) { @@ -1425,6 +1492,7 @@ For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int p->v.For.iter = iter; p->v.For.body = body; p->v.For.orelse = orelse; + p->v.For.type_comment = type_comment; p->lineno = lineno; p->col_offset = col_offset; p->end_lineno = end_lineno; @@ -1433,9 +1501,9 @@ For(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int } stmt_ty -AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int - lineno, int col_offset, int end_lineno, int end_col_offset, PyArena - *arena) +AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, + string type_comment, int lineno, int col_offset, int end_lineno, int + end_col_offset, PyArena *arena) { stmt_ty p; if (!target) { @@ -1456,6 +1524,7 @@ AsyncFor(expr_ty target, expr_ty iter, asdl_seq * body, asdl_seq * orelse, int p->v.AsyncFor.iter = iter; p->v.AsyncFor.body = body; p->v.AsyncFor.orelse = orelse; + p->v.AsyncFor.type_comment = type_comment; p->lineno = lineno; p->col_offset = col_offset; p->end_lineno = end_lineno; @@ -1512,8 +1581,8 @@ If(expr_ty test, asdl_seq * body, asdl_seq * orelse, int lineno, int } stmt_ty -With(asdl_seq * items, asdl_seq * body, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena) +With(asdl_seq * items, asdl_seq * body, string type_comment, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena *arena) { stmt_ty p; p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1522,6 +1591,7 @@ With(asdl_seq * items, asdl_seq * body, int lineno, int col_offset, int p->kind = With_kind; p->v.With.items = items; p->v.With.body = body; + p->v.With.type_comment = type_comment; p->lineno = lineno; p->col_offset = col_offset; p->end_lineno = end_lineno; @@ -1530,8 +1600,8 @@ With(asdl_seq * items, asdl_seq * body, int lineno, int col_offset, int } stmt_ty -AsyncWith(asdl_seq * items, asdl_seq * body, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena) +AsyncWith(asdl_seq * items, asdl_seq * body, string type_comment, int lineno, + int col_offset, int end_lineno, int end_col_offset, PyArena *arena) { stmt_ty p; p = (stmt_ty)PyArena_Malloc(arena, sizeof(*p)); @@ -1540,6 +1610,7 @@ AsyncWith(asdl_seq * items, asdl_seq * body, int lineno, int col_offset, int p->kind = AsyncWith_kind; p->v.AsyncWith.items = items; p->v.AsyncWith.body = body; + p->v.AsyncWith.type_comment = type_comment; p->lineno = lineno; p->col_offset = col_offset; p->end_lineno = end_lineno; @@ -2477,8 +2548,8 @@ arguments(asdl_seq * args, arg_ty vararg, asdl_seq * kwonlyargs, asdl_seq * } arg_ty -arg(identifier arg, expr_ty annotation, int lineno, int col_offset, int - end_lineno, int end_col_offset, PyArena *arena) +arg(identifier arg, expr_ty annotation, string type_comment, int lineno, int + col_offset, int end_lineno, int end_col_offset, PyArena *arena) { arg_ty p; if (!arg) { @@ -2491,6 +2562,7 @@ arg(identifier arg, expr_ty annotation, int lineno, int col_offset, int return NULL; p->arg = arg; p->annotation = annotation; + p->type_comment = type_comment; p->lineno = lineno; p->col_offset = col_offset; p->end_lineno = end_lineno; @@ -2549,6 +2621,18 @@ withitem(expr_ty context_expr, expr_ty optional_vars, PyArena *arena) return p; } +type_ignore_ty +TypeIgnore(int lineno, PyArena *arena) +{ + type_ignore_ty p; + p = (type_ignore_ty)PyArena_Malloc(arena, sizeof(*p)); + if (!p) + return NULL; + p->kind = TypeIgnore_kind; + p->v.TypeIgnore.lineno = lineno; + return p; +} + PyObject* ast2obj_mod(void* _o) @@ -2568,6 +2652,11 @@ ast2obj_mod(void* _o) if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) goto failed; Py_DECREF(value); + value = ast2obj_list(o->v.Module.type_ignores, ast2obj_type_ignore); + if (!value) goto failed; + if (_PyObject_SetAttrId(result, &PyId_type_ignores, value) == -1) + goto failed; + Py_DECREF(value); break; case Interactive_kind: result = PyType_GenericNew(Interactive_type, NULL, NULL); @@ -2587,6 +2676,20 @@ ast2obj_mod(void* _o) goto failed; Py_DECREF(value); break; + case FunctionType_kind: + result = PyType_GenericNew(FunctionType_type, NULL, NULL); + if (!result) goto failed; + value = ast2obj_list(o->v.FunctionType.argtypes, ast2obj_expr); + if (!value) goto failed; + if (_PyObject_SetAttrId(result, &PyId_argtypes, value) == -1) + goto failed; + Py_DECREF(value); + value = ast2obj_expr(o->v.FunctionType.returns); + if (!value) goto failed; + if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1) + goto failed; + Py_DECREF(value); + break; case Suite_kind: result = PyType_GenericNew(Suite_type, NULL, NULL); if (!result) goto failed; @@ -2642,6 +2745,11 @@ ast2obj_stmt(void* _o) if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1) goto failed; Py_DECREF(value); + value = ast2obj_string(o->v.FunctionDef.type_comment); + if (!value) goto failed; + if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + goto failed; + Py_DECREF(value); break; case AsyncFunctionDef_kind: result = PyType_GenericNew(AsyncFunctionDef_type, NULL, NULL); @@ -2672,6 +2780,11 @@ ast2obj_stmt(void* _o) if (_PyObject_SetAttrId(result, &PyId_returns, value) == -1) goto failed; Py_DECREF(value); + value = ast2obj_string(o->v.AsyncFunctionDef.type_comment); + if (!value) goto failed; + if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + goto failed; + Py_DECREF(value); break; case ClassDef_kind: result = PyType_GenericNew(ClassDef_type, NULL, NULL); @@ -2733,6 +2846,11 @@ ast2obj_stmt(void* _o) if (_PyObject_SetAttrId(result, &PyId_value, value) == -1) goto failed; Py_DECREF(value); + value = ast2obj_string(o->v.Assign.type_comment); + if (!value) goto failed; + if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + goto failed; + Py_DECREF(value); break; case AugAssign_kind: result = PyType_GenericNew(AugAssign_type, NULL, NULL); @@ -2800,6 +2918,11 @@ ast2obj_stmt(void* _o) if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1) goto failed; Py_DECREF(value); + value = ast2obj_string(o->v.For.type_comment); + if (!value) goto failed; + if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + goto failed; + Py_DECREF(value); break; case AsyncFor_kind: result = PyType_GenericNew(AsyncFor_type, NULL, NULL); @@ -2824,6 +2947,11 @@ ast2obj_stmt(void* _o) if (_PyObject_SetAttrId(result, &PyId_orelse, value) == -1) goto failed; Py_DECREF(value); + value = ast2obj_string(o->v.AsyncFor.type_comment); + if (!value) goto failed; + if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + goto failed; + Py_DECREF(value); break; case While_kind: result = PyType_GenericNew(While_type, NULL, NULL); @@ -2876,6 +3004,11 @@ ast2obj_stmt(void* _o) if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) goto failed; Py_DECREF(value); + value = ast2obj_string(o->v.With.type_comment); + if (!value) goto failed; + if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + goto failed; + Py_DECREF(value); break; case AsyncWith_kind: result = PyType_GenericNew(AsyncWith_type, NULL, NULL); @@ -2890,6 +3023,11 @@ ast2obj_stmt(void* _o) if (_PyObject_SetAttrId(result, &PyId_body, value) == -1) goto failed; Py_DECREF(value); + value = ast2obj_string(o->v.AsyncWith.type_comment); + if (!value) goto failed; + if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + goto failed; + Py_DECREF(value); break; case Raise_kind: result = PyType_GenericNew(Raise_type, NULL, NULL); @@ -3812,6 +3950,11 @@ ast2obj_arg(void* _o) if (_PyObject_SetAttrId(result, &PyId_annotation, value) == -1) goto failed; Py_DECREF(value); + value = ast2obj_string(o->type_comment); + if (!value) goto failed; + if (_PyObject_SetAttrId(result, &PyId_type_comment, value) == -1) + goto failed; + Py_DECREF(value); value = ast2obj_int(o->lineno); if (!value) goto failed; if (_PyObject_SetAttrId(result, &PyId_lineno, value) < 0) @@ -3923,6 +4066,33 @@ ast2obj_withitem(void* _o) return NULL; } +PyObject* +ast2obj_type_ignore(void* _o) +{ + type_ignore_ty o = (type_ignore_ty)_o; + PyObject *result = NULL, *value = NULL; + if (!o) { + Py_RETURN_NONE; + } + + switch (o->kind) { + case TypeIgnore_kind: + result = PyType_GenericNew(TypeIgnore_type, NULL, NULL); + if (!result) goto failed; + value = ast2obj_int(o->v.TypeIgnore.lineno); + if (!value) goto failed; + if (_PyObject_SetAttrId(result, &PyId_lineno, value) == -1) + goto failed; + Py_DECREF(value); + break; + } + return result; +failed: + Py_XDECREF(value); + Py_XDECREF(result); + return NULL; +} + int obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) @@ -3941,6 +4111,7 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) } if (isinstance) { asdl_seq* body; + asdl_seq* type_ignores; if (_PyObject_LookupAttrId(obj, &PyId_body, &tmp) < 0) { return 1; @@ -3972,7 +4143,37 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - *out = Module(body, arena); + if (_PyObject_LookupAttrId(obj, &PyId_type_ignores, &tmp) < 0) { + return 1; + } + if (tmp == NULL) { + PyErr_SetString(PyExc_TypeError, "required field \"type_ignores\" missing from Module"); + return 1; + } + else { + int res; + Py_ssize_t len; + Py_ssize_t i; + if (!PyList_Check(tmp)) { + PyErr_Format(PyExc_TypeError, "Module field \"type_ignores\" must be a list, not a %.200s", tmp->ob_type->tp_name); + goto failed; + } + len = PyList_GET_SIZE(tmp); + type_ignores = _Py_asdl_seq_new(len, arena); + if (type_ignores == NULL) goto failed; + for (i = 0; i < len; i++) { + type_ignore_ty val; + res = obj2ast_type_ignore(PyList_GET_ITEM(tmp, i), &val, arena); + if (res != 0) goto failed; + if (len != PyList_GET_SIZE(tmp)) { + PyErr_SetString(PyExc_RuntimeError, "Module field \"type_ignores\" changed size during iteration"); + goto failed; + } + asdl_seq_SET(type_ignores, i, val); + } + Py_CLEAR(tmp); + } + *out = Module(body, type_ignores, arena); if (*out == NULL) goto failed; return 0; } @@ -4041,6 +4242,61 @@ obj2ast_mod(PyObject* obj, mod_ty* out, PyArena* arena) if (*out == NULL) goto failed; return 0; } + isinstance = PyObject_IsInstance(obj, (PyObject*)FunctionType_type); + if (isinstance == -1) { + return 1; + } + if (isinstance) { + asdl_seq* argtypes; + expr_ty returns; + + if (_PyObject_LookupAttrId(obj, &PyId_argtypes, &tmp) < 0) { + return 1; + } + if (tmp == NULL) { + PyErr_SetString(PyExc_TypeError, "required field \"argtypes\" missing from FunctionType"); + return 1; + } + else { + int res; + Py_ssize_t len; + Py_ssize_t i; + if (!PyList_Check(tmp)) { + PyErr_Format(PyExc_TypeError, "FunctionType field \"argtypes\" must be a list, not a %.200s", tmp->ob_type->tp_name); + goto failed; + } + len = PyList_GET_SIZE(tmp); + argtypes = _Py_asdl_seq_new(len, arena); + if (argtypes == NULL) goto failed; + for (i = 0; i < len; i++) { + expr_ty val; + res = obj2ast_expr(PyList_GET_ITEM(tmp, i), &val, arena); + if (res != 0) goto failed; + if (len != PyList_GET_SIZE(tmp)) { + PyErr_SetString(PyExc_RuntimeError, "FunctionType field \"argtypes\" changed size during iteration"); + goto failed; + } + asdl_seq_SET(argtypes, i, val); + } + Py_CLEAR(tmp); + } + if (_PyObject_LookupAttrId(obj, &PyId_returns, &tmp) < 0) { + return 1; + } + if (tmp == NULL) { + PyErr_SetString(PyExc_TypeError, "required field \"returns\" missing from FunctionType"); + return 1; + } + else { + int res; + res = obj2ast_expr(tmp, &returns, arena); + if (res != 0) goto failed; + Py_CLEAR(tmp); + } + *out = FunctionType(argtypes, returns, arena); + if (*out == NULL) goto failed; + return 0; + } isinstance = PyObject_IsInstance(obj, (PyObject*)Suite_type); if (isinstance == -1) { return 1; @@ -4166,6 +4422,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) asdl_seq* body; asdl_seq* decorator_list; expr_ty returns; + string type_comment; if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) { return 1; @@ -4266,8 +4523,22 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (res != 0) goto failed; Py_CLEAR(tmp); } - *out = FunctionDef(name, args, body, decorator_list, returns, lineno, - col_offset, end_lineno, end_col_offset, arena); + if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + return 1; + } + if (tmp == NULL || tmp == Py_None) { + Py_CLEAR(tmp); + type_comment = NULL; + } + else { + int res; + res = obj2ast_string(tmp, &type_comment, arena); + if (res != 0) goto failed; + Py_CLEAR(tmp); + } + *out = FunctionDef(name, args, body, decorator_list, returns, + type_comment, lineno, col_offset, end_lineno, + end_col_offset, arena); if (*out == NULL) goto failed; return 0; } @@ -4281,6 +4552,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) asdl_seq* body; asdl_seq* decorator_list; expr_ty returns; + string type_comment; if (_PyObject_LookupAttrId(obj, &PyId_name, &tmp) < 0) { return 1; @@ -4381,9 +4653,22 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (res != 0) goto failed; Py_CLEAR(tmp); } + if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + return 1; + } + if (tmp == NULL || tmp == Py_None) { + Py_CLEAR(tmp); + type_comment = NULL; + } + else { + int res; + res = obj2ast_string(tmp, &type_comment, arena); + if (res != 0) goto failed; + Py_CLEAR(tmp); + } *out = AsyncFunctionDef(name, args, body, decorator_list, returns, - lineno, col_offset, end_lineno, end_col_offset, - arena); + type_comment, lineno, col_offset, end_lineno, + end_col_offset, arena); if (*out == NULL) goto failed; return 0; } @@ -4610,6 +4895,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (isinstance) { asdl_seq* targets; expr_ty value; + string type_comment; if (_PyObject_LookupAttrId(obj, &PyId_targets, &tmp) < 0) { return 1; @@ -4654,8 +4940,21 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (res != 0) goto failed; Py_CLEAR(tmp); } - *out = Assign(targets, value, lineno, col_offset, end_lineno, - end_col_offset, arena); + if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + return 1; + } + if (tmp == NULL || tmp == Py_None) { + Py_CLEAR(tmp); + type_comment = NULL; + } + else { + int res; + res = obj2ast_string(tmp, &type_comment, arena); + if (res != 0) goto failed; + Py_CLEAR(tmp); + } + *out = Assign(targets, value, type_comment, lineno, col_offset, + end_lineno, end_col_offset, arena); if (*out == NULL) goto failed; return 0; } @@ -4788,6 +5087,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) expr_ty iter; asdl_seq* body; asdl_seq* orelse; + string type_comment; if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) { return 1; @@ -4875,8 +5175,21 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - *out = For(target, iter, body, orelse, lineno, col_offset, end_lineno, - end_col_offset, arena); + if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + return 1; + } + if (tmp == NULL || tmp == Py_None) { + Py_CLEAR(tmp); + type_comment = NULL; + } + else { + int res; + res = obj2ast_string(tmp, &type_comment, arena); + if (res != 0) goto failed; + Py_CLEAR(tmp); + } + *out = For(target, iter, body, orelse, type_comment, lineno, + col_offset, end_lineno, end_col_offset, arena); if (*out == NULL) goto failed; return 0; } @@ -4889,6 +5202,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) expr_ty iter; asdl_seq* body; asdl_seq* orelse; + string type_comment; if (_PyObject_LookupAttrId(obj, &PyId_target, &tmp) < 0) { return 1; @@ -4976,8 +5290,21 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - *out = AsyncFor(target, iter, body, orelse, lineno, col_offset, - end_lineno, end_col_offset, arena); + if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + return 1; + } + if (tmp == NULL || tmp == Py_None) { + Py_CLEAR(tmp); + type_comment = NULL; + } + else { + int res; + res = obj2ast_string(tmp, &type_comment, arena); + if (res != 0) goto failed; + Py_CLEAR(tmp); + } + *out = AsyncFor(target, iter, body, orelse, type_comment, lineno, + col_offset, end_lineno, end_col_offset, arena); if (*out == NULL) goto failed; return 0; } @@ -5162,6 +5489,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (isinstance) { asdl_seq* items; asdl_seq* body; + string type_comment; if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) { return 1; @@ -5223,7 +5551,20 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - *out = With(items, body, lineno, col_offset, end_lineno, + if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + return 1; + } + if (tmp == NULL || tmp == Py_None) { + Py_CLEAR(tmp); + type_comment = NULL; + } + else { + int res; + res = obj2ast_string(tmp, &type_comment, arena); + if (res != 0) goto failed; + Py_CLEAR(tmp); + } + *out = With(items, body, type_comment, lineno, col_offset, end_lineno, end_col_offset, arena); if (*out == NULL) goto failed; return 0; @@ -5235,6 +5576,7 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) if (isinstance) { asdl_seq* items; asdl_seq* body; + string type_comment; if (_PyObject_LookupAttrId(obj, &PyId_items, &tmp) < 0) { return 1; @@ -5296,8 +5638,21 @@ obj2ast_stmt(PyObject* obj, stmt_ty* out, PyArena* arena) } Py_CLEAR(tmp); } - *out = AsyncWith(items, body, lineno, col_offset, end_lineno, - end_col_offset, arena); + if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + return 1; + } + if (tmp == NULL || tmp == Py_None) { + Py_CLEAR(tmp); + type_comment = NULL; + } + else { + int res; + res = obj2ast_string(tmp, &type_comment, arena); + if (res != 0) goto failed; + Py_CLEAR(tmp); + } + *out = AsyncWith(items, body, type_comment, lineno, col_offset, + end_lineno, end_col_offset, arena); if (*out == NULL) goto failed; return 0; } @@ -7968,6 +8323,7 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena) PyObject* tmp = NULL; identifier arg; expr_ty annotation; + string type_comment; int lineno; int col_offset; int end_lineno; @@ -7999,6 +8355,19 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena) if (res != 0) goto failed; Py_CLEAR(tmp); } + if (_PyObject_LookupAttrId(obj, &PyId_type_comment, &tmp) < 0) { + return 1; + } + if (tmp == NULL || tmp == Py_None) { + Py_CLEAR(tmp); + type_comment = NULL; + } + else { + int res; + res = obj2ast_string(tmp, &type_comment, arena); + if (res != 0) goto failed; + Py_CLEAR(tmp); + } if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) { return 1; } @@ -8051,8 +8420,8 @@ obj2ast_arg(PyObject* obj, arg_ty* out, PyArena* arena) if (res != 0) goto failed; Py_CLEAR(tmp); } - *out = arg(arg, annotation, lineno, col_offset, end_lineno, end_col_offset, - arena); + *out = arg(arg, annotation, type_comment, lineno, col_offset, end_lineno, + end_col_offset, arena); return 0; failed: Py_XDECREF(tmp); @@ -8179,6 +8548,48 @@ obj2ast_withitem(PyObject* obj, withitem_ty* out, PyArena* arena) return 1; } +int +obj2ast_type_ignore(PyObject* obj, type_ignore_ty* out, PyArena* arena) +{ + int isinstance; + + PyObject *tmp = NULL; + + if (obj == Py_None) { + *out = NULL; + return 0; + } + isinstance = PyObject_IsInstance(obj, (PyObject*)TypeIgnore_type); + if (isinstance == -1) { + return 1; + } + if (isinstance) { + int lineno; + + if (_PyObject_LookupAttrId(obj, &PyId_lineno, &tmp) < 0) { + return 1; + } + if (tmp == NULL) { + PyErr_SetString(PyExc_TypeError, "required field \"lineno\" missing from TypeIgnore"); + return 1; + } + else { + int res; + res = obj2ast_int(tmp, &lineno, arena); + if (res != 0) goto failed; + Py_CLEAR(tmp); + } + *out = TypeIgnore(lineno, arena); + if (*out == NULL) goto failed; + return 0; + } + + PyErr_Format(PyExc_TypeError, "expected some sort of type_ignore, but got %R", obj); + failed: + Py_XDECREF(tmp); + return 1; +} + static struct PyModuleDef _astmodule = { PyModuleDef_HEAD_INIT, "_ast" @@ -8201,6 +8612,8 @@ PyInit__ast(void) 0) return NULL; if (PyDict_SetItemString(d, "Expression", (PyObject*)Expression_type) < 0) return NULL; + if (PyDict_SetItemString(d, "FunctionType", (PyObject*)FunctionType_type) < + 0) return NULL; if (PyDict_SetItemString(d, "Suite", (PyObject*)Suite_type) < 0) return NULL; if (PyDict_SetItemString(d, "stmt", (PyObject*)stmt_type) < 0) return NULL; @@ -8377,6 +8790,10 @@ PyInit__ast(void) NULL; if (PyDict_SetItemString(d, "withitem", (PyObject*)withitem_type) < 0) return NULL; + if (PyDict_SetItemString(d, "type_ignore", (PyObject*)type_ignore_type) < + 0) return NULL; + if (PyDict_SetItemString(d, "TypeIgnore", (PyObject*)TypeIgnore_type) < 0) + return NULL; return m; } From e7f207d4d25de0248df4f71799bac12f23d3a15a Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Sat, 19 Jan 2019 10:34:20 -0800 Subject: [PATCH 09/46] Make ast.c compile by adding NULL for all type_comment arguments --- Python/ast.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Python/ast.c b/Python/ast.c index 855acca29e7c3c..e7505db307dfb0 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -793,7 +793,7 @@ PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags, } } } - res = Module(stmts, arena); + res = Module(stmts, NULL, arena); break; case eval_input: { expr_ty testlist_ast; @@ -1232,7 +1232,7 @@ ast_for_arg(struct compiling *c, const node *n) return NULL; } - ret = arg(name, annotation, LINENO(n), n->n_col_offset, + ret = arg(name, annotation, NULL, LINENO(n), n->n_col_offset, n->n_end_lineno, n->n_end_col_offset, c->c_arena); if (!ret) return NULL; @@ -1291,7 +1291,7 @@ handle_keywordonly_args(struct compiling *c, const node *n, int start, goto error; if (forbidden_name(c, argname, ch, 0)) goto error; - arg = arg(argname, annotation, LINENO(ch), ch->n_col_offset, + arg = arg(argname, annotation, NULL, LINENO(ch), ch->n_col_offset, ch->n_end_lineno, ch->n_end_col_offset, c->c_arena); if (!arg) @@ -1607,10 +1607,10 @@ ast_for_funcdef_impl(struct compiling *c, const node *n0, get_last_end_pos(body, &end_lineno, &end_col_offset); if (is_async) - return AsyncFunctionDef(name, args, body, decorator_seq, returns, + return AsyncFunctionDef(name, args, body, decorator_seq, returns, NULL, LINENO(n0), n0->n_col_offset, end_lineno, end_col_offset, c->c_arena); else - return FunctionDef(name, args, body, decorator_seq, returns, + return FunctionDef(name, args, body, decorator_seq, returns, NULL, LINENO(n), n->n_col_offset, end_lineno, end_col_offset, c->c_arena); } @@ -3113,7 +3113,7 @@ ast_for_expr_stmt(struct compiling *c, const node *n) expression = ast_for_expr(c, value); if (!expression) return NULL; - return Assign(targets, expression, LINENO(n), n->n_col_offset, + return Assign(targets, expression, NULL, LINENO(n), n->n_col_offset, n->n_end_lineno, n->n_end_col_offset, c->c_arena); } } @@ -3840,11 +3840,11 @@ ast_for_for_stmt(struct compiling *c, const node *n0, bool is_async) get_last_end_pos(suite_seq, &end_lineno, &end_col_offset); } if (is_async) - return AsyncFor(target, expression, suite_seq, seq, + return AsyncFor(target, expression, suite_seq, seq, NULL, LINENO(n0), n0->n_col_offset, end_lineno, end_col_offset, c->c_arena); else - return For(target, expression, suite_seq, seq, + return For(target, expression, suite_seq, seq, NULL, LINENO(n), n->n_col_offset, end_lineno, end_col_offset, c->c_arena); } @@ -4039,10 +4039,10 @@ ast_for_with_stmt(struct compiling *c, const node *n0, bool is_async) get_last_end_pos(body, &end_lineno, &end_col_offset); if (is_async) - return AsyncWith(items, body, LINENO(n0), n0->n_col_offset, + return AsyncWith(items, body, NULL, LINENO(n0), n0->n_col_offset, end_lineno, end_col_offset, c->c_arena); else - return With(items, body, LINENO(n), n->n_col_offset, + return With(items, body, NULL, LINENO(n), n->n_col_offset, end_lineno, end_col_offset, c->c_arena); } From 8b426b9dcad51ee64bb47c0cbde7236080662ce3 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Sat, 19 Jan 2019 11:34:52 -0800 Subject: [PATCH 10/46] Make recognition of type comments conditional on a flag (off by default) --- Parser/tokenizer.c | 76 ++++++++++++++++++++++++---------------------- Parser/tokenizer.h | 2 ++ 2 files changed, 42 insertions(+), 36 deletions(-) diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index 17af219178c451..d9d7f999466ab8 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -86,6 +86,7 @@ tok_new(void) tok->decoding_readline = NULL; tok->decoding_buffer = NULL; #endif + tok->type_comments = 0; return tok; } @@ -1253,51 +1254,54 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) if (c == '#') { const char *prefix, *p, *type_start; - while (c != EOF && c != '\n') + while (c != EOF && c != '\n') { c = tok_nextc(tok); + } - p = tok->start; - prefix = type_comment_prefix; - while (*prefix && p < tok->cur) { - if (*prefix == ' ') { - while (*p == ' ' || *p == '\t') + if (tok->type_comments) { + p = tok->start; + prefix = type_comment_prefix; + while (*prefix && p < tok->cur) { + if (*prefix == ' ') { + while (*p == ' ' || *p == '\t') + p++; + } else if (*prefix == *p) { p++; - } else if (*prefix == *p) { - p++; - } else { - break; - } + } else { + break; + } - prefix++; - } + prefix++; + } - /* This is a type comment if we matched all of type_comment_prefix. */ - if (!*prefix) { - int is_type_ignore = 1; - tok_backup(tok, c); /* don't eat the newline or EOF */ + /* This is a type comment if we matched all of type_comment_prefix. */ + if (!*prefix) { + int is_type_ignore = 1; + tok_backup(tok, c); /* don't eat the newline or EOF */ - type_start = p; + type_start = p; - is_type_ignore = tok->cur >= p + 6 && memcmp(p, "ignore", 6) == 0; - p += 6; - while (is_type_ignore && p < tok->cur) { - if (*p == '#') - break; - is_type_ignore = is_type_ignore && (*p == ' ' || *p == '\t'); - p++; - } + is_type_ignore = tok->cur >= p + 6 && memcmp(p, "ignore", 6) == 0; + p += 6; + while (is_type_ignore && p < tok->cur) { + if (*p == '#') + break; + is_type_ignore = is_type_ignore && (*p == ' ' || *p == '\t'); + p++; + } - if (is_type_ignore) { - /* If this type ignore is the only thing on the line, consume the newline also. */ - if (blankline) { - tok_nextc(tok); - tok->atbol = 1; + if (is_type_ignore) { + /* If this type ignore is the only thing on the line, consume the newline also. */ + if (blankline) { + tok_nextc(tok); + tok->atbol = 1; + } + return TYPE_IGNORE; + } else { + *p_start = (char *) type_start; /* after type_comment_prefix */ + *p_end = tok->cur; + return TYPE_COMMENT; } - return TYPE_IGNORE; - } else { - *p_start = (char *) type_start; /* after type_comment_prefix */ - *p_end = tok->cur; - return TYPE_COMMENT; } } } diff --git a/Parser/tokenizer.h b/Parser/tokenizer.h index 096ce687ec54e4..9639c658b1c2b3 100644 --- a/Parser/tokenizer.h +++ b/Parser/tokenizer.h @@ -70,6 +70,8 @@ struct tok_state { const char* enc; /* Encoding for the current str. */ const char* str; const char* input; /* Tokenizer's newline translated copy of the string. */ + + int type_comments; /* Whether to look for type comments */ }; extern struct tok_state *PyTokenizer_FromString(const char *, int); From 72e4f4d7bc516b6d7692a07b1a6c812871c4fd4a Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Sat, 19 Jan 2019 12:04:08 -0800 Subject: [PATCH 11/46] Define flags to turn on parsing type comments Demo: `compile(sample, "", "exec", PyCF_ONLY_AST|0x1000)` This will crash if type comments are present. It doesn't *work* yet -- type comments cause crashes in ast.c and type ignore comments aren't passed on to Module yet. --- Include/compile.h | 1 + Include/parsetok.h | 1 + Parser/parsetok.c | 6 ++++++ Python/bltinmodule.c | 2 +- Python/pythonrun.c | 2 ++ 5 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Include/compile.h b/Include/compile.h index 2dacfff37f8c2a..36477c01e2ba63 100644 --- a/Include/compile.h +++ b/Include/compile.h @@ -22,6 +22,7 @@ PyAPI_FUNC(PyCodeObject *) PyNode_Compile(struct _node *, const char *); #define PyCF_DONT_IMPLY_DEDENT 0x0200 #define PyCF_ONLY_AST 0x0400 #define PyCF_IGNORE_COOKIE 0x0800 +#define PyCF_TYPE_COMMENTS 0x1000 #ifndef Py_LIMITED_API typedef struct { diff --git a/Include/parsetok.h b/Include/parsetok.h index 1217c46d0ed7b9..e95dd31fb79a29 100644 --- a/Include/parsetok.h +++ b/Include/parsetok.h @@ -37,6 +37,7 @@ typedef struct { #define PyPARSE_IGNORE_COOKIE 0x0010 #define PyPARSE_BARRY_AS_BDFL 0x0020 +#define PyPARSE_TYPE_COMMENTS 0x0040 PyAPI_FUNC(node *) PyParser_ParseString(const char *, grammar *, int, perrdetail *); diff --git a/Parser/parsetok.c b/Parser/parsetok.c index 40db8a2b82905f..042fff71a02fb8 100644 --- a/Parser/parsetok.c +++ b/Parser/parsetok.c @@ -91,6 +91,9 @@ PyParser_ParseStringObject(const char *s, PyObject *filename, err_ret->error = PyErr_Occurred() ? E_DECODE : E_NOMEM; return NULL; } + if (*flags & PyPARSE_TYPE_COMMENTS) { + tok->type_comments = 1; + } #ifndef PGEN Py_INCREF(err_ret->filename); @@ -159,6 +162,9 @@ PyParser_ParseFileObject(FILE *fp, PyObject *filename, err_ret->error = E_NOMEM; return NULL; } + if (*flags & PyPARSE_TYPE_COMMENTS) { + tok->type_comments = 1; + } #ifndef PGEN Py_INCREF(err_ret->filename); tok->filename = err_ret->filename; diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 332142fc6ffc2a..930adb496e14cd 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -771,7 +771,7 @@ builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename, cf.cf_flags = flags | PyCF_SOURCE_IS_UTF8; if (flags & - ~(PyCF_MASK | PyCF_MASK_OBSOLETE | PyCF_DONT_IMPLY_DEDENT | PyCF_ONLY_AST)) + ~(PyCF_MASK | PyCF_MASK_OBSOLETE | PyCF_DONT_IMPLY_DEDENT | PyCF_ONLY_AST | PyCF_TYPE_COMMENTS)) { PyErr_SetString(PyExc_ValueError, "compile(): unrecognised flags"); diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 9b6371d9c0da64..c7a622c83d37c6 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -158,6 +158,8 @@ static int PARSER_FLAGS(PyCompilerFlags *flags) parser_flags |= PyPARSE_IGNORE_COOKIE; if (flags->cf_flags & CO_FUTURE_BARRY_AS_BDFL) parser_flags |= PyPARSE_BARRY_AS_BDFL; + if (flags->cf_flags & PyCF_TYPE_COMMENTS) + parser_flags |= PyPARSE_TYPE_COMMENTS; return parser_flags; } From 3d19dbb39e10d84780f2fb6ec171dfc7b3f82a7a Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Sat, 19 Jan 2019 12:10:43 -0800 Subject: [PATCH 12/46] Support passing type ignores to Module object --- Python/ast.c | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/Python/ast.c b/Python/ast.c index e7505db307dfb0..f8ca99e39da432 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -751,6 +751,7 @@ PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags, { int i, j, k, num; asdl_seq *stmts = NULL; + asdl_seq *type_ignores = NULL; stmt_ty s; node *ch; struct compiling c; @@ -793,7 +794,23 @@ PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags, } } } - res = Module(stmts, NULL, arena); + + /* Type ignores are stored under the ENDMARKER in file_input. */ + ch = CHILD(n, NCH(n) - 1); + REQ(ch, ENDMARKER); + num = NCH(ch); + type_ignores = _Py_asdl_seq_new(num, arena); + if (!type_ignores) + goto out; + + for (i = 0; i < num; i++) { + type_ignore_ty ti = TypeIgnore(LINENO(CHILD(ch, i)), arena); + if (!ti) + goto out; + asdl_seq_SET(type_ignores, i, ti); + } + + res = Module(stmts, type_ignores, arena); break; case eval_input: { expr_ty testlist_ast; From d273d6746aec19a666008afd5c1b4c2cd35807a4 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 21 Jan 2019 18:15:39 -0800 Subject: [PATCH 13/46] Support TYPE_COMMENT in ast.c for all nodes that need it This works, it just needs tests --- Python/ast.c | 192 +++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 162 insertions(+), 30 deletions(-) diff --git a/Python/ast.c b/Python/ast.c index f8ca99e39da432..9a8c9a6b421540 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -696,6 +696,13 @@ ast_error(struct compiling *c, const node *n, const char *errmsg, ...) small_stmt elements is returned. */ +static string +new_type_comment(const char *s, struct compiling *c) +{ + return PyUnicode_DecodeUTF8(s, strlen(s), NULL); +} +#define NEW_TYPE_COMMENT(n) new_type_comment(STR(n), c) + static int num_stmts(const node *n) { @@ -723,11 +730,15 @@ num_stmts(const node *n) case simple_stmt: return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */ case suite: + /* suite: simple_stmt | NEWLINE [TYPE_COMMENT NEWLINE] INDENT stmt+ DEDENT */ if (NCH(n) == 1) return num_stmts(CHILD(n, 0)); else { + i = 2; l = 0; - for (i = 2; i < (NCH(n) - 1); i++) + if (TYPE(CHILD(n, 1)) == TYPE_COMMENT) + i += 2; + for (; i < (NCH(n) - 1); i++) l += num_stmts(CHILD(n, i)); return l; } @@ -756,6 +767,8 @@ PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags, node *ch; struct compiling c; mod_ty res = NULL; + asdl_seq *argtypes = NULL; + expr_ty ret, arg; c.c_arena = arena; /* borrowed reference */ @@ -862,6 +875,40 @@ PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags, res = Interactive(stmts, arena); } break; + case func_type_input: + n = CHILD(n, 0); + REQ(n, func_type); + + if (TYPE(CHILD(n, 1)) == typelist) { + ch = CHILD(n, 1); + /* this is overly permissive -- we don't pay any attention to + * stars on the args -- just parse them into an ordered list */ + num = 0; + for (i = 0; i < NCH(ch); i++) { + if (TYPE(CHILD(ch, i)) == test) + num++; + } + + argtypes = _Py_asdl_seq_new(num, arena); + + j = 0; + for (i = 0; i < NCH(ch); i++) { + if (TYPE(CHILD(ch, i)) == test) { + arg = ast_for_expr(&c, CHILD(ch, i)); + if (!arg) + goto out; + asdl_seq_SET(argtypes, j++, arg); + } + } + } + else + argtypes = _Py_asdl_seq_new(0, arena); + + ret = ast_for_expr(&c, CHILD(n, NCH(n) - 1)); + if (!ret) + goto out; + res = FunctionType(argtypes, ret, arena); + break; default: PyErr_Format(PyExc_SystemError, "invalid node %d for PyAST_FromNode", TYPE(n)); @@ -1314,7 +1361,14 @@ handle_keywordonly_args(struct compiling *c, const node *n, int start, if (!arg) goto error; asdl_seq_SET(kwonlyargs, j++, arg); - i += 2; /* the name and the comma */ + i += 1; /* the name */ + if (TYPE(CHILD(n, i)) == COMMA) + i += 1; /* the comma, if present */ + break; + case TYPE_COMMENT: + /* arg will be equal to the last argument processed */ + arg->type_comment = NEW_TYPE_COMMENT(ch); + i += 1; break; case DOUBLESTAR: return i; @@ -1444,11 +1498,14 @@ ast_for_arguments(struct compiling *c, const node *n) if (!arg) return NULL; asdl_seq_SET(posargs, k++, arg); - i += 2; /* the name and the comma */ + i += 1; /* the name */ + if (TYPE(CHILD(n, i)) == COMMA) + i += 1; /* the comma, if present */ break; case STAR: if (i+1 >= NCH(n) || - (i+2 == NCH(n) && TYPE(CHILD(n, i+1)) == COMMA)) { + (i+2 == NCH(n) && (TYPE(CHILD(n, i+1)) == COMMA + || TYPE(CHILD(n, i+1)) == TYPE_COMMENT))) { ast_error(c, CHILD(n, i), "named arguments must follow bare *"); return NULL; @@ -1457,6 +1514,13 @@ ast_for_arguments(struct compiling *c, const node *n) if (TYPE(ch) == COMMA) { int res = 0; i += 2; /* now follows keyword only arguments */ + + if (TYPE(CHILD(n, i)) == TYPE_COMMENT) { + ast_error(c, CHILD(n, i), + "bare * has associated type comment"); + return NULL; + } + res = handle_keywordonly_args(c, n, i, kwonlyargs, kwdefaults); if (res == -1) return NULL; @@ -1467,7 +1531,15 @@ ast_for_arguments(struct compiling *c, const node *n) if (!vararg) return NULL; - i += 3; + i += 2; /* the star and the name */ + if (TYPE(CHILD(n, i)) == COMMA) + i += 1; /* the comma, if present */ + + if (TYPE(CHILD(n, i)) == TYPE_COMMENT) { + vararg->type_comment = NEW_TYPE_COMMENT(CHILD(n, i)); + i += 1; + } + if (i < NCH(n) && (TYPE(CHILD(n, i)) == tfpdef || TYPE(CHILD(n, i)) == vfpdef)) { int res = 0; @@ -1484,7 +1556,19 @@ ast_for_arguments(struct compiling *c, const node *n) kwarg = ast_for_arg(c, ch); if (!kwarg) return NULL; - i += 3; + i += 2; /* the double star and the name */ + if (TYPE(CHILD(n, i)) == COMMA) + i += 1; /* the comma, if present */ + break; + case TYPE_COMMENT: + assert(i); + + if (kwarg) + arg = kwarg; + + /* arg will be equal to the last argument processed */ + arg->type_comment = NEW_TYPE_COMMENT(ch); + i += 1; break; default: PyErr_Format(PyExc_SystemError, @@ -1593,7 +1677,7 @@ static stmt_ty ast_for_funcdef_impl(struct compiling *c, const node *n0, asdl_seq *decorator_seq, bool is_async) { - /* funcdef: 'def' NAME parameters ['->' test] ':' suite */ + /* funcdef: 'def' NAME parameters ['->' test] ':' [TYPE_COMMENT] suite */ const node * const n = is_async ? CHILD(n0, 1) : n0; identifier name; arguments_ty args; @@ -1601,6 +1685,8 @@ ast_for_funcdef_impl(struct compiling *c, const node *n0, expr_ty returns = NULL; int name_i = 1; int end_lineno, end_col_offset; + node *tc; + string type_comment = NULL; REQ(n, funcdef); @@ -1618,16 +1704,29 @@ ast_for_funcdef_impl(struct compiling *c, const node *n0, return NULL; name_i += 2; } + if (TYPE(CHILD(n, name_i + 3)) == TYPE_COMMENT) { + type_comment = NEW_TYPE_COMMENT(CHILD(n, name_i + 3)); + name_i += 1; + } body = ast_for_suite(c, CHILD(n, name_i + 3)); if (!body) return NULL; get_last_end_pos(body, &end_lineno, &end_col_offset); + if (!type_comment && NCH(CHILD(n, name_i + 3)) > 1) { + /* If the function doesn't have a type comment on the same line, check + * if the suite has a type comment in it. */ + tc = CHILD(CHILD(n, name_i + 3), 1); + + if (TYPE(tc) == TYPE_COMMENT) + type_comment = NEW_TYPE_COMMENT(tc); + } + if (is_async) - return AsyncFunctionDef(name, args, body, decorator_seq, returns, NULL, + return AsyncFunctionDef(name, args, body, decorator_seq, returns, type_comment, LINENO(n0), n0->n_col_offset, end_lineno, end_col_offset, c->c_arena); else - return FunctionDef(name, args, body, decorator_seq, returns, NULL, + return FunctionDef(name, args, body, decorator_seq, returns, type_comment, LINENO(n), n->n_col_offset, end_lineno, end_col_offset, c->c_arena); } @@ -2968,15 +3067,16 @@ ast_for_expr_stmt(struct compiling *c, const node *n) { REQ(n, expr_stmt); /* expr_stmt: testlist_star_expr (annassign | augassign (yield_expr|testlist) | - ('=' (yield_expr|testlist_star_expr))*) + ('=' (yield_expr|testlist_star_expr))* [TYPE_COMMENT]) annassign: ':' test ['=' test] testlist_star_expr: (test|star_expr) (',' test|star_expr)* [','] augassign: '+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' | '<<=' | '>>=' | '**=' | '//=' test: ... here starts the operator precedence dance */ + int num = NCH(n); - if (NCH(n) == 1) { + if (num == 1 || (num == 2 && TYPE(CHILD(n, 1)) == TYPE_COMMENT)) { expr_ty e = ast_for_testlist(c, CHILD(n, 0)); if (!e) return NULL; @@ -3096,17 +3196,22 @@ ast_for_expr_stmt(struct compiling *c, const node *n) } } else { - int i; + int i, nch_minus_type, has_type_comment; asdl_seq *targets; node *value; expr_ty expression; + string type_comment; /* a normal assignment */ REQ(CHILD(n, 1), EQUAL); - targets = _Py_asdl_seq_new(NCH(n) / 2, c->c_arena); + + has_type_comment = TYPE(CHILD(n, num - 1)) == TYPE_COMMENT; + nch_minus_type = num - has_type_comment; + + targets = _Py_asdl_seq_new(nch_minus_type / 2, c->c_arena); if (!targets) return NULL; - for (i = 0; i < NCH(n) - 2; i += 2) { + for (i = 0; i < nch_minus_type - 2; i += 2) { expr_ty e; node *ch = CHILD(n, i); if (TYPE(ch) == yield_expr) { @@ -3123,14 +3228,18 @@ ast_for_expr_stmt(struct compiling *c, const node *n) asdl_seq_SET(targets, i / 2, e); } - value = CHILD(n, NCH(n) - 1); + value = CHILD(n, nch_minus_type - 1); if (TYPE(value) == testlist_star_expr) expression = ast_for_testlist(c, value); else expression = ast_for_expr(c, value); if (!expression) return NULL; - return Assign(targets, expression, NULL, LINENO(n), n->n_col_offset, + if (has_type_comment) + type_comment = NEW_TYPE_COMMENT(CHILD(n, nch_minus_type)); + else + type_comment = NULL; + return Assign(targets, expression, type_comment, LINENO(n), n->n_col_offset, n->n_end_lineno, n->n_end_col_offset, c->c_arena); } } @@ -3557,7 +3666,7 @@ ast_for_assert_stmt(struct compiling *c, const node *n) static asdl_seq * ast_for_suite(struct compiling *c, const node *n) { - /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */ + /* suite: simple_stmt | NEWLINE [TYPE_COMMENT NEWLINE] INDENT stmt+ DEDENT */ asdl_seq *seq; stmt_ty s; int i, total, num, end, pos = 0; @@ -3587,7 +3696,11 @@ ast_for_suite(struct compiling *c, const node *n) } } else { - for (i = 2; i < (NCH(n) - 1); i++) { + i = 2; + if (TYPE(CHILD(n, 1)) == TYPE_COMMENT) + i += 2; + + for (; i < (NCH(n) - 1); i++) { ch = CHILD(n, i); REQ(ch, stmt); num = num_stmts(ch); @@ -3821,11 +3934,15 @@ ast_for_for_stmt(struct compiling *c, const node *n0, bool is_async) expr_ty target, first; const node *node_target; int end_lineno, end_col_offset; - /* for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite] */ + int has_type_comment; + string type_comment; + /* for_stmt: 'for' exprlist 'in' testlist ':' [TYPE_COMMENT] suite ['else' ':' suite] */ REQ(n, for_stmt); - if (NCH(n) == 9) { - seq = ast_for_suite(c, CHILD(n, 8)); + has_type_comment = TYPE(CHILD(n, 5)) == TYPE_COMMENT; + + if (NCH(n) == 9 + has_type_comment) { + seq = ast_for_suite(c, CHILD(n, 8 + has_type_comment)); if (!seq) return NULL; } @@ -3847,7 +3964,7 @@ ast_for_for_stmt(struct compiling *c, const node *n0, bool is_async) expression = ast_for_testlist(c, CHILD(n, 3)); if (!expression) return NULL; - suite_seq = ast_for_suite(c, CHILD(n, 5)); + suite_seq = ast_for_suite(c, CHILD(n, 5 + has_type_comment)); if (!suite_seq) return NULL; @@ -3856,12 +3973,18 @@ ast_for_for_stmt(struct compiling *c, const node *n0, bool is_async) } else { get_last_end_pos(suite_seq, &end_lineno, &end_col_offset); } + + if (has_type_comment) + type_comment = NEW_TYPE_COMMENT(CHILD(n, 5)); + else + type_comment = NULL; + if (is_async) - return AsyncFor(target, expression, suite_seq, seq, NULL, + return AsyncFor(target, expression, suite_seq, seq, type_comment, LINENO(n0), n0->n_col_offset, end_lineno, end_col_offset, c->c_arena); else - return For(target, expression, suite_seq, seq, NULL, + return For(target, expression, suite_seq, seq, type_comment, LINENO(n), n->n_col_offset, end_lineno, end_col_offset, c->c_arena); } @@ -4029,21 +4152,25 @@ ast_for_with_item(struct compiling *c, const node *n) return withitem(context_expr, optional_vars, c->c_arena); } -/* with_stmt: 'with' with_item (',' with_item)* ':' suite */ +/* with_stmt: 'with' with_item (',' with_item)* ':' [TYPE_COMMENT] suite */ static stmt_ty ast_for_with_stmt(struct compiling *c, const node *n0, bool is_async) { const node * const n = is_async ? CHILD(n0, 1) : n0; - int i, n_items, end_lineno, end_col_offset; + int i, n_items, nch_minus_type, has_type_comment, end_lineno, end_col_offset; asdl_seq *items, *body; + string type_comment; REQ(n, with_stmt); - n_items = (NCH(n) - 2) / 2; + has_type_comment = TYPE(CHILD(n, NCH(n) - 2)) == TYPE_COMMENT; + nch_minus_type = NCH(n) - has_type_comment; + + n_items = (nch_minus_type - 2) / 2; items = _Py_asdl_seq_new(n_items, c->c_arena); if (!items) return NULL; - for (i = 1; i < NCH(n) - 2; i += 2) { + for (i = 1; i < nch_minus_type - 2; i += 2) { withitem_ty item = ast_for_with_item(c, CHILD(n, i)); if (!item) return NULL; @@ -4055,11 +4182,16 @@ ast_for_with_stmt(struct compiling *c, const node *n0, bool is_async) return NULL; get_last_end_pos(body, &end_lineno, &end_col_offset); + if (has_type_comment) + type_comment = NEW_TYPE_COMMENT(CHILD(n, NCH(n) - 2)); + else + type_comment = NULL; + if (is_async) - return AsyncWith(items, body, NULL, LINENO(n0), n0->n_col_offset, + return AsyncWith(items, body, type_comment, LINENO(n0), n0->n_col_offset, end_lineno, end_col_offset, c->c_arena); else - return With(items, body, NULL, LINENO(n), n->n_col_offset, + return With(items, body, type_comment, LINENO(n), n->n_col_offset, end_lineno, end_col_offset, c->c_arena); } From 830d63a57c6e713ddbef802694a355d8df4f687d Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 22 Jan 2019 09:32:58 -0800 Subject: [PATCH 14/46] Regenerate Lib/symbol.py --- Lib/symbol.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Lib/symbol.py b/Lib/symbol.py index 40d0ed1e035507..3a52d809790112 100644 --- a/Lib/symbol.py +++ b/Lib/symbol.py @@ -99,6 +99,9 @@ encoding_decl = 340 yield_expr = 341 yield_arg = 342 +func_type_input = 343 +func_type = 344 +typelist = 345 #--end constants-- sym_name = {} From 71aecd553d4a03903ff0a304b56b29accc61c73d Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 22 Jan 2019 09:57:33 -0800 Subject: [PATCH 15/46] Make growable_int_array functions static --- Parser/parsetok.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Parser/parsetok.c b/Parser/parsetok.c index 042fff71a02fb8..c543353ecd5caa 100644 --- a/Parser/parsetok.c +++ b/Parser/parsetok.c @@ -21,7 +21,8 @@ typedef struct { size_t num_items; } growable_int_array; -int growable_int_array_init(growable_int_array *arr, size_t initial_size) { +static int +growable_int_array_init(growable_int_array *arr, size_t initial_size) { assert(initial_size > 0); arr->items = malloc(initial_size * sizeof(*arr->items)); arr->size = initial_size; @@ -30,7 +31,8 @@ int growable_int_array_init(growable_int_array *arr, size_t initial_size) { return arr->items != NULL; } -int growable_int_array_add(growable_int_array *arr, int item) { +static int +growable_int_array_add(growable_int_array *arr, int item) { if (arr->num_items >= arr->size) { arr->size *= 2; arr->items = realloc(arr->items, arr->size * sizeof(*arr->items)); @@ -43,7 +45,8 @@ int growable_int_array_add(growable_int_array *arr, int item) { return 1; } -void growable_int_array_deallocate(growable_int_array *arr) { +static void +growable_int_array_deallocate(growable_int_array *arr) { free(arr->items); } From 53ceee624db0e3a056bd773699f0906e601dcbbd Mon Sep 17 00:00:00 2001 From: "blurb-it[bot]" Date: Tue, 22 Jan 2019 19:17:28 +0000 Subject: [PATCH 16/46] News blurb (thank you blurb-it) --- .../Core and Builtins/2019-01-22-19-17-27.bpo-35766.gh1tHZ.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2019-01-22-19-17-27.bpo-35766.gh1tHZ.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2019-01-22-19-17-27.bpo-35766.gh1tHZ.rst b/Misc/NEWS.d/next/Core and Builtins/2019-01-22-19-17-27.bpo-35766.gh1tHZ.rst new file mode 100644 index 00000000000000..29c5f34d6a3e32 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2019-01-22-19-17-27.bpo-35766.gh1tHZ.rst @@ -0,0 +1 @@ +Add the option to parse PEP 484 type comments in the ast module. (Off by default.) This is merging the key functionality of the third party fork thereof, [typed_ast](https://github.com/python/typed_ast). \ No newline at end of file From 6ddca66f5ac52565a5d2591f5e35cc50854e9e7d Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 22 Jan 2019 10:44:26 -0800 Subject: [PATCH 17/46] Fix test_ast.py --- Lib/test/test_ast.py | 131 ++++++++++++++++++++++--------------------- 1 file changed, 66 insertions(+), 65 deletions(-) diff --git a/Lib/test/test_ast.py b/Lib/test/test_ast.py index 09e425de2c30e3..609c8b2c6a7fa1 100644 --- a/Lib/test/test_ast.py +++ b/Lib/test/test_ast.py @@ -455,7 +455,7 @@ class N2(ast.Num): def test_module(self): body = [ast.Num(42)] - x = ast.Module(body) + x = ast.Module(body, []) self.assertEqual(x.body, body) def test_nodeclasses(self): @@ -524,13 +524,13 @@ def test_pickling(self): def test_invalid_sum(self): pos = dict(lineno=2, col_offset=3) - m = ast.Module([ast.Expr(ast.expr(**pos), **pos)]) + m = ast.Module([ast.Expr(ast.expr(**pos), **pos)], []) with self.assertRaises(TypeError) as cm: compile(m, "", "exec") self.assertIn("but got <_ast.expr", str(cm.exception)) def test_invalid_identitifer(self): - m = ast.Module([ast.Expr(ast.Name(42, ast.Load()))]) + m = ast.Module([ast.Expr(ast.Name(42, ast.Load()))], []) ast.fix_missing_locations(m) with self.assertRaises(TypeError) as cm: compile(m, "", "exec") @@ -575,11 +575,11 @@ def test_dump(self): self.assertEqual(ast.dump(node), "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load()), " "args=[Name(id='eggs', ctx=Load()), Constant(value='and cheese')], " - "keywords=[]))])" + "keywords=[]))], type_ignores=[])" ) self.assertEqual(ast.dump(node, annotate_fields=False), "Module([Expr(Call(Name('spam', Load()), [Name('eggs', Load()), " - "Constant('and cheese')], []))])" + "Constant('and cheese')], []))], [])" ) self.assertEqual(ast.dump(node, include_attributes=True), "Module(body=[Expr(value=Call(func=Name(id='spam', ctx=Load(), " @@ -588,7 +588,7 @@ def test_dump(self): "end_lineno=1, end_col_offset=9), Constant(value='and cheese', " "lineno=1, col_offset=11, end_lineno=1, end_col_offset=23)], keywords=[], " "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24), " - "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24)])" + "lineno=1, col_offset=0, end_lineno=1, end_col_offset=24)], type_ignores=[])" ) def test_copy_location(self): @@ -617,7 +617,8 @@ def test_fix_missing_locations(self): "lineno=1, col_offset=0, end_lineno=1, end_col_offset=0), " "args=[Constant(value='eggs', lineno=1, col_offset=0, end_lineno=1, " "end_col_offset=0)], keywords=[], lineno=1, col_offset=0, end_lineno=1, " - "end_col_offset=0), lineno=1, col_offset=0, end_lineno=1, end_col_offset=0)])" + "end_col_offset=0), lineno=1, col_offset=0, end_lineno=1, end_col_offset=0)], " + "type_ignores=[])" ) def test_increment_lineno(self): @@ -760,7 +761,7 @@ def test_bad_integer(self): names=[ast.alias(name='sleep')], level=None, lineno=None, col_offset=None)] - mod = ast.Module(body) + mod = ast.Module(body, []) with self.assertRaises(ValueError) as cm: compile(mod, 'test', 'exec') self.assertIn("invalid integer value: None", str(cm.exception)) @@ -770,7 +771,7 @@ def test_level_as_none(self): names=[ast.alias(name='sleep')], level=None, lineno=0, col_offset=0)] - mod = ast.Module(body) + mod = ast.Module(body, []) code = compile(mod, 'test', 'exec') ns = {} exec(code, ns) @@ -790,11 +791,11 @@ def mod(self, mod, msg=None, mode="exec", *, exc=ValueError): self.assertIn(msg, str(cm.exception)) def expr(self, node, msg=None, *, exc=ValueError): - mod = ast.Module([ast.Expr(node)]) + mod = ast.Module([ast.Expr(node)], []) self.mod(mod, msg, exc=exc) def stmt(self, stmt, msg=None): - mod = ast.Module([stmt]) + mod = ast.Module([stmt], []) self.mod(mod, msg) def test_module(self): @@ -1603,61 +1604,61 @@ def main(): raise SystemExit unittest.main() -#### EVERYTHING BELOW IS GENERATED ##### +#### EVERYTHING BELOW IS GENERATED BY python Lib/test/test_ast.py -g ##### exec_results = [ -('Module', [('Expr', (1, 0), ('Constant', (1, 0), None))]), -('Module', [('Expr', (1, 0), ('Constant', (1, 0), 'module docstring'))]), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Pass', (1, 9))], [], None)]), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Expr', (1, 9), ('Constant', (1, 9), 'function docstring'))], [], None)]), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None)], None, [], [], None, []), [('Pass', (1, 10))], [], None)]), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None)], None, [], [], None, [('Constant', (1, 8), 0)]), [('Pass', (1, 12))], [], None)]), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], ('arg', (1, 7), 'args', None), [], [], None, []), [('Pass', (1, 14))], [], None)]), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], ('arg', (1, 8), 'kwargs', None), []), [('Pass', (1, 17))], [], None)]), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None), ('arg', (1, 9), 'b', None), ('arg', (1, 14), 'c', None), ('arg', (1, 22), 'd', None), ('arg', (1, 28), 'e', None)], ('arg', (1, 35), 'args', None), [('arg', (1, 41), 'f', None)], [('Constant', (1, 43), 42)], ('arg', (1, 49), 'kwargs', None), [('Constant', (1, 11), 1), ('Constant', (1, 16), None), ('List', (1, 24), [], ('Load',)), ('Dict', (1, 30), [], [])]), [('Expr', (1, 58), ('Constant', (1, 58), 'doc for f()'))], [], None)]), -('Module', [('ClassDef', (1, 0), 'C', [], [], [('Pass', (1, 8))], [])]), -('Module', [('ClassDef', (1, 0), 'C', [], [], [('Expr', (1, 9), ('Constant', (1, 9), 'docstring for class C'))], [])]), -('Module', [('ClassDef', (1, 0), 'C', [('Name', (1, 8), 'object', ('Load',))], [], [('Pass', (1, 17))], [])]), -('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Return', (1, 8), ('Constant', (1, 15), 1))], [], None)]), -('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])]), -('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Constant', (1, 4), 1))]), -('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 0), 'a', ('Store',)), ('Name', (1, 2), 'b', ('Store',))], ('Store',))], ('Name', (1, 6), 'c', ('Load',)))]), -('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)))]), -('Module', [('Assign', (1, 0), [('List', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)))]), -('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Constant', (1, 5), 1))]), -('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [])]), -('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])]), -('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])]), -('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',)))], [('Pass', (1, 13))])]), -('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',))), ('withitem', ('Name', (1, 13), 'z', ('Load',)), ('Name', (1, 18), 'q', ('Store',)))], [('Pass', (1, 21))])]), -('Module', [('Raise', (1, 0), ('Call', (1, 6), ('Name', (1, 6), 'Exception', ('Load',)), [('Constant', (1, 16), 'string')], []), None)]), -('Module', [('Try', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [], [])]), -('Module', [('Try', (1, 0), [('Pass', (2, 2))], [], [], [('Pass', (4, 2))])]), -('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)]), -('Module', [('Import', (1, 0), [('alias', 'sys', None)])]), -('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)]), -('Module', [('Global', (1, 0), ['v'])]), -('Module', [('Expr', (1, 0), ('Constant', (1, 0), 1))]), -('Module', [('Pass', (1, 0))]), -('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Break', (1, 11))], [])]), -('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Continue', (1, 11))], [])]), -('Module', [('For', (1, 0), ('Tuple', (1, 4), [('Name', (1, 4), 'a', ('Store',)), ('Name', (1, 6), 'b', ('Store',))], ('Store',)), ('Name', (1, 11), 'c', ('Load',)), [('Pass', (1, 14))], [])]), -('Module', [('For', (1, 0), ('Tuple', (1, 4), [('Name', (1, 5), 'a', ('Store',)), ('Name', (1, 7), 'b', ('Store',))], ('Store',)), ('Name', (1, 13), 'c', ('Load',)), [('Pass', (1, 16))], [])]), -('Module', [('For', (1, 0), ('List', (1, 4), [('Name', (1, 5), 'a', ('Store',)), ('Name', (1, 7), 'b', ('Store',))], ('Store',)), ('Name', (1, 13), 'c', ('Load',)), [('Pass', (1, 16))], [])]), -('Module', [('Expr', (1, 0), ('GeneratorExp', (1, 0), ('Tuple', (2, 4), [('Name', (3, 4), 'Aa', ('Load',)), ('Name', (5, 7), 'Bb', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (8, 4), [('Name', (8, 4), 'Aa', ('Store',)), ('Name', (10, 4), 'Bb', ('Store',))], ('Store',)), ('Name', (10, 10), 'Cc', ('Load',)), [], 0)]))]), -('Module', [('Expr', (1, 0), ('DictComp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), ('Name', (1, 5), 'b', ('Load',)), [('comprehension', ('Name', (1, 11), 'w', ('Store',)), ('Name', (1, 16), 'x', ('Load',)), [], 0), ('comprehension', ('Name', (1, 22), 'm', ('Store',)), ('Name', (1, 27), 'p', ('Load',)), [('Name', (1, 32), 'g', ('Load',))], 0)]))]), -('Module', [('Expr', (1, 0), ('DictComp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), ('Name', (1, 5), 'b', ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'v', ('Store',)), ('Name', (1, 13), 'w', ('Store',))], ('Store',)), ('Name', (1, 18), 'x', ('Load',)), [], 0)]))]), -('Module', [('Expr', (1, 0), ('SetComp', (1, 0), ('Name', (1, 1), 'r', ('Load',)), [('comprehension', ('Name', (1, 7), 'l', ('Store',)), ('Name', (1, 12), 'x', ('Load',)), [('Name', (1, 17), 'g', ('Load',))], 0)]))]), -('Module', [('Expr', (1, 0), ('SetComp', (1, 0), ('Name', (1, 1), 'r', ('Load',)), [('comprehension', ('Tuple', (1, 7), [('Name', (1, 7), 'l', ('Store',)), ('Name', (1, 9), 'm', ('Store',))], ('Store',)), ('Name', (1, 14), 'x', ('Load',)), [], 0)]))]), -('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Expr', (2, 1), ('Constant', (2, 1), 'async function')), ('Expr', (3, 1), ('Await', (3, 1), ('Call', (3, 7), ('Name', (3, 7), 'something', ('Load',)), [], [])))], [], None)]), -('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('AsyncFor', (2, 1), ('Name', (2, 11), 'e', ('Store',)), ('Name', (2, 16), 'i', ('Load',)), [('Expr', (2, 19), ('Constant', (2, 19), 1))], [('Expr', (3, 7), ('Constant', (3, 7), 2))])], [], None)]), -('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('AsyncWith', (2, 1), [('withitem', ('Name', (2, 12), 'a', ('Load',)), ('Name', (2, 17), 'b', ('Store',)))], [('Expr', (2, 20), ('Constant', (2, 20), 1))])], [], None)]), -('Module', [('Expr', (1, 0), ('Dict', (1, 0), [None, ('Constant', (1, 10), 2)], [('Dict', (1, 3), [('Constant', (1, 4), 1)], [('Constant', (1, 6), 2)]), ('Constant', (1, 12), 3)]))]), -('Module', [('Expr', (1, 0), ('Set', (1, 0), [('Starred', (1, 1), ('Set', (1, 2), [('Constant', (1, 3), 1), ('Constant', (1, 6), 2)]), ('Load',)), ('Constant', (1, 10), 3)]))]), -('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Expr', (2, 1), ('ListComp', (2, 1), ('Name', (2, 2), 'i', ('Load',)), [('comprehension', ('Name', (2, 14), 'b', ('Store',)), ('Name', (2, 19), 'c', ('Load',)), [], 1)]))], [], None)]), -('Module', [('FunctionDef', (3, 0), 'f', ('arguments', [], None, [], [], None, []), [('Pass', (3, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 0), ('Name', (2, 1), 'deco2', ('Load',)), [], [])], None)]), -('Module', [('AsyncFunctionDef', (3, 0), 'f', ('arguments', [], None, [], [], None, []), [('Pass', (3, 15))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 0), ('Name', (2, 1), 'deco2', ('Load',)), [], [])], None)]), -('Module', [('ClassDef', (3, 0), 'C', [], [], [('Pass', (3, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 0), ('Name', (2, 1), 'deco2', ('Load',)), [], [])])]), -('Module', [('FunctionDef', (2, 0), 'f', ('arguments', [], None, [], [], None, []), [('Pass', (2, 9))], [('Call', (1, 1), ('Name', (1, 1), 'deco', ('Load',)), [('GeneratorExp', (1, 5), ('Name', (1, 6), 'a', ('Load',)), [('comprehension', ('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 17), 'b', ('Load',)), [], 0)])], [])], None)]), +('Module', [('Expr', (1, 0), ('Constant', (1, 0), None))], []), +('Module', [('Expr', (1, 0), ('Constant', (1, 0), 'module docstring'))], []), +('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Pass', (1, 9))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Expr', (1, 9), ('Constant', (1, 9), 'function docstring'))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], None, [], [], None, []), [('Pass', (1, 10))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None)], None, [], [], None, [('Constant', (1, 8), 0)]), [('Pass', (1, 12))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], ('arg', (1, 7), 'args', None, None), [], [], None, []), [('Pass', (1, 14))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], ('arg', (1, 8), 'kwargs', None, None), []), [('Pass', (1, 17))], [], None, None)], []), +('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [('arg', (1, 6), 'a', None, None), ('arg', (1, 9), 'b', None, None), ('arg', (1, 14), 'c', None, None), ('arg', (1, 22), 'd', None, None), ('arg', (1, 28), 'e', None, None)], ('arg', (1, 35), 'args', None, None), [('arg', (1, 41), 'f', None, None)], [('Constant', (1, 43), 42)], ('arg', (1, 49), 'kwargs', None, None), [('Constant', (1, 11), 1), ('Constant', (1, 16), None), ('List', (1, 24), [], ('Load',)), ('Dict', (1, 30), [], [])]), [('Expr', (1, 58), ('Constant', (1, 58), 'doc for f()'))], [], None, None)], []), +('Module', [('ClassDef', (1, 0), 'C', [], [], [('Pass', (1, 8))], [])], []), +('Module', [('ClassDef', (1, 0), 'C', [], [], [('Expr', (1, 9), ('Constant', (1, 9), 'docstring for class C'))], [])], []), +('Module', [('ClassDef', (1, 0), 'C', [('Name', (1, 8), 'object', ('Load',))], [], [('Pass', (1, 17))], [])], []), +('Module', [('FunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Return', (1, 8), ('Constant', (1, 15), 1))], [], None, None)], []), +('Module', [('Delete', (1, 0), [('Name', (1, 4), 'v', ('Del',))])], []), +('Module', [('Assign', (1, 0), [('Name', (1, 0), 'v', ('Store',))], ('Constant', (1, 4), 1), None)], []), +('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 0), 'a', ('Store',)), ('Name', (1, 2), 'b', ('Store',))], ('Store',))], ('Name', (1, 6), 'c', ('Load',)), None)], []), +('Module', [('Assign', (1, 0), [('Tuple', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)), None)], []), +('Module', [('Assign', (1, 0), [('List', (1, 0), [('Name', (1, 1), 'a', ('Store',)), ('Name', (1, 3), 'b', ('Store',))], ('Store',))], ('Name', (1, 8), 'c', ('Load',)), None)], []), +('Module', [('AugAssign', (1, 0), ('Name', (1, 0), 'v', ('Store',)), ('Add',), ('Constant', (1, 5), 1))], []), +('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Pass', (1, 11))], [], None)], []), +('Module', [('While', (1, 0), ('Name', (1, 6), 'v', ('Load',)), [('Pass', (1, 8))], [])], []), +('Module', [('If', (1, 0), ('Name', (1, 3), 'v', ('Load',)), [('Pass', (1, 5))], [])], []), +('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',)))], [('Pass', (1, 13))], None)], []), +('Module', [('With', (1, 0), [('withitem', ('Name', (1, 5), 'x', ('Load',)), ('Name', (1, 10), 'y', ('Store',))), ('withitem', ('Name', (1, 13), 'z', ('Load',)), ('Name', (1, 18), 'q', ('Store',)))], [('Pass', (1, 21))], None)], []), +('Module', [('Raise', (1, 0), ('Call', (1, 6), ('Name', (1, 6), 'Exception', ('Load',)), [('Constant', (1, 16), 'string')], []), None)], []), +('Module', [('Try', (1, 0), [('Pass', (2, 2))], [('ExceptHandler', (3, 0), ('Name', (3, 7), 'Exception', ('Load',)), None, [('Pass', (4, 2))])], [], [])], []), +('Module', [('Try', (1, 0), [('Pass', (2, 2))], [], [], [('Pass', (4, 2))])], []), +('Module', [('Assert', (1, 0), ('Name', (1, 7), 'v', ('Load',)), None)], []), +('Module', [('Import', (1, 0), [('alias', 'sys', None)])], []), +('Module', [('ImportFrom', (1, 0), 'sys', [('alias', 'v', None)], 0)], []), +('Module', [('Global', (1, 0), ['v'])], []), +('Module', [('Expr', (1, 0), ('Constant', (1, 0), 1))], []), +('Module', [('Pass', (1, 0))], []), +('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Break', (1, 11))], [], None)], []), +('Module', [('For', (1, 0), ('Name', (1, 4), 'v', ('Store',)), ('Name', (1, 9), 'v', ('Load',)), [('Continue', (1, 11))], [], None)], []), +('Module', [('For', (1, 0), ('Tuple', (1, 4), [('Name', (1, 4), 'a', ('Store',)), ('Name', (1, 6), 'b', ('Store',))], ('Store',)), ('Name', (1, 11), 'c', ('Load',)), [('Pass', (1, 14))], [], None)], []), +('Module', [('For', (1, 0), ('Tuple', (1, 4), [('Name', (1, 5), 'a', ('Store',)), ('Name', (1, 7), 'b', ('Store',))], ('Store',)), ('Name', (1, 13), 'c', ('Load',)), [('Pass', (1, 16))], [], None)], []), +('Module', [('For', (1, 0), ('List', (1, 4), [('Name', (1, 5), 'a', ('Store',)), ('Name', (1, 7), 'b', ('Store',))], ('Store',)), ('Name', (1, 13), 'c', ('Load',)), [('Pass', (1, 16))], [], None)], []), +('Module', [('Expr', (1, 0), ('GeneratorExp', (1, 0), ('Tuple', (2, 4), [('Name', (3, 4), 'Aa', ('Load',)), ('Name', (5, 7), 'Bb', ('Load',))], ('Load',)), [('comprehension', ('Tuple', (8, 4), [('Name', (8, 4), 'Aa', ('Store',)), ('Name', (10, 4), 'Bb', ('Store',))], ('Store',)), ('Name', (10, 10), 'Cc', ('Load',)), [], 0)]))], []), +('Module', [('Expr', (1, 0), ('DictComp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), ('Name', (1, 5), 'b', ('Load',)), [('comprehension', ('Name', (1, 11), 'w', ('Store',)), ('Name', (1, 16), 'x', ('Load',)), [], 0), ('comprehension', ('Name', (1, 22), 'm', ('Store',)), ('Name', (1, 27), 'p', ('Load',)), [('Name', (1, 32), 'g', ('Load',))], 0)]))], []), +('Module', [('Expr', (1, 0), ('DictComp', (1, 0), ('Name', (1, 1), 'a', ('Load',)), ('Name', (1, 5), 'b', ('Load',)), [('comprehension', ('Tuple', (1, 11), [('Name', (1, 11), 'v', ('Store',)), ('Name', (1, 13), 'w', ('Store',))], ('Store',)), ('Name', (1, 18), 'x', ('Load',)), [], 0)]))], []), +('Module', [('Expr', (1, 0), ('SetComp', (1, 0), ('Name', (1, 1), 'r', ('Load',)), [('comprehension', ('Name', (1, 7), 'l', ('Store',)), ('Name', (1, 12), 'x', ('Load',)), [('Name', (1, 17), 'g', ('Load',))], 0)]))], []), +('Module', [('Expr', (1, 0), ('SetComp', (1, 0), ('Name', (1, 1), 'r', ('Load',)), [('comprehension', ('Tuple', (1, 7), [('Name', (1, 7), 'l', ('Store',)), ('Name', (1, 9), 'm', ('Store',))], ('Store',)), ('Name', (1, 14), 'x', ('Load',)), [], 0)]))], []), +('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Expr', (2, 1), ('Constant', (2, 1), 'async function')), ('Expr', (3, 1), ('Await', (3, 1), ('Call', (3, 7), ('Name', (3, 7), 'something', ('Load',)), [], [])))], [], None, None)], []), +('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('AsyncFor', (2, 1), ('Name', (2, 11), 'e', ('Store',)), ('Name', (2, 16), 'i', ('Load',)), [('Expr', (2, 19), ('Constant', (2, 19), 1))], [('Expr', (3, 7), ('Constant', (3, 7), 2))], None)], [], None, None)], []), +('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('AsyncWith', (2, 1), [('withitem', ('Name', (2, 12), 'a', ('Load',)), ('Name', (2, 17), 'b', ('Store',)))], [('Expr', (2, 20), ('Constant', (2, 20), 1))], None)], [], None, None)], []), +('Module', [('Expr', (1, 0), ('Dict', (1, 0), [None, ('Constant', (1, 10), 2)], [('Dict', (1, 3), [('Constant', (1, 4), 1)], [('Constant', (1, 6), 2)]), ('Constant', (1, 12), 3)]))], []), +('Module', [('Expr', (1, 0), ('Set', (1, 0), [('Starred', (1, 1), ('Set', (1, 2), [('Constant', (1, 3), 1), ('Constant', (1, 6), 2)]), ('Load',)), ('Constant', (1, 10), 3)]))], []), +('Module', [('AsyncFunctionDef', (1, 0), 'f', ('arguments', [], None, [], [], None, []), [('Expr', (2, 1), ('ListComp', (2, 1), ('Name', (2, 2), 'i', ('Load',)), [('comprehension', ('Name', (2, 14), 'b', ('Store',)), ('Name', (2, 19), 'c', ('Load',)), [], 1)]))], [], None, None)], []), +('Module', [('FunctionDef', (3, 0), 'f', ('arguments', [], None, [], [], None, []), [('Pass', (3, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 0), ('Name', (2, 1), 'deco2', ('Load',)), [], [])], None, None)], []), +('Module', [('AsyncFunctionDef', (3, 0), 'f', ('arguments', [], None, [], [], None, []), [('Pass', (3, 15))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 0), ('Name', (2, 1), 'deco2', ('Load',)), [], [])], None, None)], []), +('Module', [('ClassDef', (3, 0), 'C', [], [], [('Pass', (3, 9))], [('Name', (1, 1), 'deco1', ('Load',)), ('Call', (2, 0), ('Name', (2, 1), 'deco2', ('Load',)), [], [])])], []), +('Module', [('FunctionDef', (2, 0), 'f', ('arguments', [], None, [], [], None, []), [('Pass', (2, 9))], [('Call', (1, 1), ('Name', (1, 1), 'deco', ('Load',)), [('GeneratorExp', (1, 5), ('Name', (1, 6), 'a', ('Load',)), [('comprehension', ('Name', (1, 12), 'a', ('Store',)), ('Name', (1, 17), 'b', ('Load',)), [], 0)])], [])], None, None)], []), ] single_results = [ ('Interactive', [('Expr', (1, 0), ('BinOp', (1, 0), ('Constant', (1, 0), 1), ('Add',), ('Constant', (1, 2), 2)))]), From 36c212bd153f044700c4fe0ff2e2312c4f364d58 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 22 Jan 2019 10:55:48 -0800 Subject: [PATCH 18/46] Fix test_asdl_parser.py --- Lib/test/test_asdl_parser.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_asdl_parser.py b/Lib/test/test_asdl_parser.py index 30e6466dbb325a..9eaceecd50dbc0 100644 --- a/Lib/test/test_asdl_parser.py +++ b/Lib/test/test_asdl_parser.py @@ -117,7 +117,8 @@ def visitConstructor(self, cons): v = CustomVisitor() v.visit(self.types['mod']) - self.assertEqual(v.names_with_seq, ['Module', 'Interactive', 'Suite']) + self.assertEqual(v.names_with_seq, + ['Module', 'Module', 'Interactive', 'FunctionType', 'Suite']) if __name__ == '__main__': From d2091edcf3ece52e10d38ec2cf2284ea435ad1a3 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 22 Jan 2019 20:30:33 -0800 Subject: [PATCH 19/46] Hacky way to get tests to pass This fixes if 1: foo() but does nothing about def f(): foo() The latter still reports 'SyntaxError: invalid syntax'. So this is not a real solution, just a stop-gap measure until I find a better solution. --- Grammar/Grammar | 6 +- Include/graminit.h | 85 +-- Python/ast.c | 4 +- Python/graminit.c | 1229 ++++++++++++++++++++++---------------------- 4 files changed, 678 insertions(+), 646 deletions(-) diff --git a/Grammar/Grammar b/Grammar/Grammar index 23ec102c257a47..e72de02b68eda6 100644 --- a/Grammar/Grammar +++ b/Grammar/Grammar @@ -20,7 +20,7 @@ decorators: decorator+ decorated: decorators (classdef | funcdef | async_funcdef) async_funcdef: 'async' funcdef -funcdef: 'def' NAME parameters ['->' test] ':' [TYPE_COMMENT] suite +funcdef: 'def' NAME parameters ['->' test] ':' [TYPE_COMMENT] func_body_suite parameters: '(' [typedargslist] ')' typedargslist: (tfpdef ['=' test] (',' [TYPE_COMMENT] tfpdef ['=' test])* (TYPE_COMMENT | [',' [TYPE_COMMENT] [ @@ -85,7 +85,9 @@ with_item: test ['as' expr] # NB compile.c makes sure that the default except clause is last except_clause: 'except' [test ['as' NAME]] # the TYPE_COMMENT in suites is only parsed for funcdefs, but can't go elsewhere due to ambiguity -suite: simple_stmt | NEWLINE [TYPE_COMMENT NEWLINE] INDENT stmt+ DEDENT +func_body_suite: simple_stmt | NEWLINE [TYPE_COMMENT NEWLINE] INDENT stmt+ DEDENT +suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT + test: or_test ['if' or_test 'else' test] | lambdef test_nocond: or_test | lambdef_nocond diff --git a/Include/graminit.h b/Include/graminit.h index 6f3232c47227af..920c04784286b8 100644 --- a/Include/graminit.h +++ b/Include/graminit.h @@ -48,45 +48,46 @@ #define with_stmt 301 #define with_item 302 #define except_clause 303 -#define suite 304 -#define test 305 -#define test_nocond 306 -#define lambdef 307 -#define lambdef_nocond 308 -#define or_test 309 -#define and_test 310 -#define not_test 311 -#define comparison 312 -#define comp_op 313 -#define star_expr 314 -#define expr 315 -#define xor_expr 316 -#define and_expr 317 -#define shift_expr 318 -#define arith_expr 319 -#define term 320 -#define factor 321 -#define power 322 -#define atom_expr 323 -#define atom 324 -#define testlist_comp 325 -#define trailer 326 -#define subscriptlist 327 -#define subscript 328 -#define sliceop 329 -#define exprlist 330 -#define testlist 331 -#define dictorsetmaker 332 -#define classdef 333 -#define arglist 334 -#define argument 335 -#define comp_iter 336 -#define sync_comp_for 337 -#define comp_for 338 -#define comp_if 339 -#define encoding_decl 340 -#define yield_expr 341 -#define yield_arg 342 -#define func_type_input 343 -#define func_type 344 -#define typelist 345 +#define func_body_suite 304 +#define suite 305 +#define test 306 +#define test_nocond 307 +#define lambdef 308 +#define lambdef_nocond 309 +#define or_test 310 +#define and_test 311 +#define not_test 312 +#define comparison 313 +#define comp_op 314 +#define star_expr 315 +#define expr 316 +#define xor_expr 317 +#define and_expr 318 +#define shift_expr 319 +#define arith_expr 320 +#define term 321 +#define factor 322 +#define power 323 +#define atom_expr 324 +#define atom 325 +#define testlist_comp 326 +#define trailer 327 +#define subscriptlist 328 +#define subscript 329 +#define sliceop 330 +#define exprlist 331 +#define testlist 332 +#define dictorsetmaker 333 +#define classdef 334 +#define arglist 335 +#define argument 336 +#define comp_iter 337 +#define sync_comp_for 338 +#define comp_for 339 +#define comp_if 340 +#define encoding_decl 341 +#define yield_expr 342 +#define yield_arg 343 +#define func_type_input 344 +#define func_type 345 +#define typelist 346 diff --git a/Python/ast.c b/Python/ast.c index 9a8c9a6b421540..b91c2bbc0462d9 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -730,7 +730,9 @@ num_stmts(const node *n) case simple_stmt: return NCH(n) / 2; /* Divide by 2 to remove count of semi-colons */ case suite: - /* suite: simple_stmt | NEWLINE [TYPE_COMMENT NEWLINE] INDENT stmt+ DEDENT */ + case func_body_suite: + /* func_body_suite: simple_stmt | NEWLINE [TYPE_COMMENT NEWLINE] INDENT stmt+ DEDENT */ + /* suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT */ if (NCH(n) == 1) return num_stmts(CHILD(n, 0)); else { diff --git a/Python/graminit.c b/Python/graminit.c index 259793c9079d6c..e15b3855d19ffe 100644 --- a/Python/graminit.c +++ b/Python/graminit.c @@ -941,18 +941,18 @@ static arc arcs_41_2[1] = { {27, 3}, }; static arc arcs_41_3[1] = { - {29, 4}, + {99, 4}, }; static arc arcs_41_4[3] = { - {99, 1}, - {100, 5}, + {100, 1}, + {101, 5}, {0, 4}, }; static arc arcs_41_5[1] = { {27, 6}, }; static arc arcs_41_6[1] = { - {29, 7}, + {99, 7}, }; static arc arcs_41_7[1] = { {0, 7}, @@ -968,7 +968,7 @@ static state states_41[8] = { {1, arcs_41_7}, }; static arc arcs_42_0[1] = { - {101, 1}, + {102, 1}, }; static arc arcs_42_1[1] = { {26, 2}, @@ -977,17 +977,17 @@ static arc arcs_42_2[1] = { {27, 3}, }; static arc arcs_42_3[1] = { - {29, 4}, + {99, 4}, }; static arc arcs_42_4[2] = { - {100, 5}, + {101, 5}, {0, 4}, }; static arc arcs_42_5[1] = { {27, 6}, }; static arc arcs_42_6[1] = { - {29, 7}, + {99, 7}, }; static arc arcs_42_7[1] = { {0, 7}, @@ -1003,13 +1003,13 @@ static state states_42[8] = { {1, arcs_42_7}, }; static arc arcs_43_0[1] = { - {102, 1}, + {103, 1}, }; static arc arcs_43_1[1] = { {67, 2}, }; static arc arcs_43_2[1] = { - {103, 3}, + {104, 3}, }; static arc arcs_43_3[1] = { {9, 4}, @@ -1019,20 +1019,20 @@ static arc arcs_43_4[1] = { }; static arc arcs_43_5[2] = { {28, 6}, - {29, 7}, + {99, 7}, }; static arc arcs_43_6[1] = { - {29, 7}, + {99, 7}, }; static arc arcs_43_7[2] = { - {100, 8}, + {101, 8}, {0, 7}, }; static arc arcs_43_8[1] = { {27, 9}, }; static arc arcs_43_9[1] = { - {29, 10}, + {99, 10}, }; static arc arcs_43_10[1] = { {0, 10}, @@ -1051,17 +1051,17 @@ static state states_43[11] = { {1, arcs_43_10}, }; static arc arcs_44_0[1] = { - {104, 1}, + {105, 1}, }; static arc arcs_44_1[1] = { {27, 2}, }; static arc arcs_44_2[1] = { - {29, 3}, + {99, 3}, }; static arc arcs_44_3[2] = { - {105, 4}, - {106, 5}, + {106, 4}, + {107, 5}, }; static arc arcs_44_4[1] = { {27, 6}, @@ -1070,15 +1070,15 @@ static arc arcs_44_5[1] = { {27, 7}, }; static arc arcs_44_6[1] = { - {29, 8}, + {99, 8}, }; static arc arcs_44_7[1] = { - {29, 9}, + {99, 9}, }; static arc arcs_44_8[4] = { - {105, 4}, - {100, 10}, - {106, 5}, + {106, 4}, + {101, 10}, + {107, 5}, {0, 8}, }; static arc arcs_44_9[1] = { @@ -1088,10 +1088,10 @@ static arc arcs_44_10[1] = { {27, 11}, }; static arc arcs_44_11[1] = { - {29, 12}, + {99, 12}, }; static arc arcs_44_12[2] = { - {106, 5}, + {107, 5}, {0, 12}, }; static state states_44[13] = { @@ -1110,10 +1110,10 @@ static state states_44[13] = { {2, arcs_44_12}, }; static arc arcs_45_0[1] = { - {107, 1}, + {108, 1}, }; static arc arcs_45_1[1] = { - {108, 2}, + {109, 2}, }; static arc arcs_45_2[2] = { {33, 1}, @@ -1121,10 +1121,10 @@ static arc arcs_45_2[2] = { }; static arc arcs_45_3[2] = { {28, 4}, - {29, 5}, + {99, 5}, }; static arc arcs_45_4[1] = { - {29, 5}, + {99, 5}, }; static arc arcs_45_5[1] = { {0, 5}, @@ -1145,7 +1145,7 @@ static arc arcs_46_1[2] = { {0, 1}, }; static arc arcs_46_2[1] = { - {109, 3}, + {110, 3}, }; static arc arcs_46_3[1] = { {0, 3}, @@ -1157,7 +1157,7 @@ static state states_46[4] = { {1, arcs_46_3}, }; static arc arcs_47_0[1] = { - {110, 1}, + {111, 1}, }; static arc arcs_47_1[2] = { {26, 2}, @@ -1189,7 +1189,7 @@ static arc arcs_48_1[1] = { }; static arc arcs_48_2[2] = { {28, 3}, - {111, 4}, + {112, 4}, }; static arc arcs_48_3[1] = { {2, 5}, @@ -1198,11 +1198,11 @@ static arc arcs_48_4[1] = { {6, 6}, }; static arc arcs_48_5[1] = { - {111, 4}, + {112, 4}, }; static arc arcs_48_6[2] = { {6, 6}, - {112, 1}, + {113, 1}, }; static state states_48[7] = { {2, arcs_48_0}, @@ -1214,69 +1214,70 @@ static state states_48[7] = { {2, arcs_48_6}, }; static arc arcs_49_0[2] = { - {113, 1}, - {114, 2}, + {3, 1}, + {2, 2}, }; -static arc arcs_49_1[2] = { - {98, 3}, +static arc arcs_49_1[1] = { {0, 1}, }; static arc arcs_49_2[1] = { - {0, 2}, + {112, 3}, }; static arc arcs_49_3[1] = { - {113, 4}, -}; -static arc arcs_49_4[1] = { - {100, 5}, + {6, 4}, }; -static arc arcs_49_5[1] = { - {26, 2}, +static arc arcs_49_4[2] = { + {6, 4}, + {113, 1}, }; -static state states_49[6] = { +static state states_49[5] = { {2, arcs_49_0}, - {2, arcs_49_1}, + {1, arcs_49_1}, {1, arcs_49_2}, {1, arcs_49_3}, - {1, arcs_49_4}, - {1, arcs_49_5}, + {2, arcs_49_4}, }; static arc arcs_50_0[2] = { - {113, 1}, - {116, 1}, + {114, 1}, + {115, 2}, }; -static arc arcs_50_1[1] = { +static arc arcs_50_1[2] = { + {98, 3}, {0, 1}, }; -static state states_50[2] = { - {2, arcs_50_0}, - {1, arcs_50_1}, +static arc arcs_50_2[1] = { + {0, 2}, }; -static arc arcs_51_0[1] = { - {117, 1}, +static arc arcs_50_3[1] = { + {114, 4}, }; -static arc arcs_51_1[2] = { - {36, 2}, - {27, 3}, +static arc arcs_50_4[1] = { + {101, 5}, }; -static arc arcs_51_2[1] = { - {27, 3}, +static arc arcs_50_5[1] = { + {26, 2}, }; -static arc arcs_51_3[1] = { - {26, 4}, +static state states_50[6] = { + {2, arcs_50_0}, + {2, arcs_50_1}, + {1, arcs_50_2}, + {1, arcs_50_3}, + {1, arcs_50_4}, + {1, arcs_50_5}, +}; +static arc arcs_51_0[2] = { + {114, 1}, + {117, 1}, }; -static arc arcs_51_4[1] = { - {0, 4}, +static arc arcs_51_1[1] = { + {0, 1}, }; -static state states_51[5] = { - {1, arcs_51_0}, - {2, arcs_51_1}, - {1, arcs_51_2}, - {1, arcs_51_3}, - {1, arcs_51_4}, +static state states_51[2] = { + {2, arcs_51_0}, + {1, arcs_51_1}, }; static arc arcs_52_0[1] = { - {117, 1}, + {118, 1}, }; static arc arcs_52_1[2] = { {36, 2}, @@ -1286,7 +1287,7 @@ static arc arcs_52_2[1] = { {27, 3}, }; static arc arcs_52_3[1] = { - {115, 4}, + {26, 4}, }; static arc arcs_52_4[1] = { {0, 4}, @@ -1302,108 +1303,120 @@ static arc arcs_53_0[1] = { {118, 1}, }; static arc arcs_53_1[2] = { - {119, 0}, - {0, 1}, + {36, 2}, + {27, 3}, +}; +static arc arcs_53_2[1] = { + {27, 3}, +}; +static arc arcs_53_3[1] = { + {116, 4}, }; -static state states_53[2] = { +static arc arcs_53_4[1] = { + {0, 4}, +}; +static state states_53[5] = { {1, arcs_53_0}, {2, arcs_53_1}, + {1, arcs_53_2}, + {1, arcs_53_3}, + {1, arcs_53_4}, }; static arc arcs_54_0[1] = { - {120, 1}, + {119, 1}, }; static arc arcs_54_1[2] = { - {121, 0}, + {120, 0}, {0, 1}, }; static state states_54[2] = { {1, arcs_54_0}, {2, arcs_54_1}, }; -static arc arcs_55_0[2] = { - {122, 1}, - {123, 2}, +static arc arcs_55_0[1] = { + {121, 1}, +}; +static arc arcs_55_1[2] = { + {122, 0}, + {0, 1}, +}; +static state states_55[2] = { + {1, arcs_55_0}, + {2, arcs_55_1}, +}; +static arc arcs_56_0[2] = { + {123, 1}, + {124, 2}, }; -static arc arcs_55_1[1] = { - {120, 2}, +static arc arcs_56_1[1] = { + {121, 2}, }; -static arc arcs_55_2[1] = { +static arc arcs_56_2[1] = { {0, 2}, }; -static state states_55[3] = { - {2, arcs_55_0}, - {1, arcs_55_1}, - {1, arcs_55_2}, +static state states_56[3] = { + {2, arcs_56_0}, + {1, arcs_56_1}, + {1, arcs_56_2}, }; -static arc arcs_56_0[1] = { - {109, 1}, +static arc arcs_57_0[1] = { + {110, 1}, }; -static arc arcs_56_1[2] = { - {124, 0}, +static arc arcs_57_1[2] = { + {125, 0}, {0, 1}, }; -static state states_56[2] = { - {1, arcs_56_0}, - {2, arcs_56_1}, +static state states_57[2] = { + {1, arcs_57_0}, + {2, arcs_57_1}, }; -static arc arcs_57_0[10] = { - {125, 1}, +static arc arcs_58_0[10] = { {126, 1}, {127, 1}, {128, 1}, {129, 1}, {130, 1}, {131, 1}, - {103, 1}, - {122, 2}, - {132, 3}, + {132, 1}, + {104, 1}, + {123, 2}, + {133, 3}, }; -static arc arcs_57_1[1] = { +static arc arcs_58_1[1] = { {0, 1}, }; -static arc arcs_57_2[1] = { - {103, 1}, +static arc arcs_58_2[1] = { + {104, 1}, }; -static arc arcs_57_3[2] = { - {122, 1}, +static arc arcs_58_3[2] = { + {123, 1}, {0, 3}, }; -static state states_57[4] = { - {10, arcs_57_0}, - {1, arcs_57_1}, - {1, arcs_57_2}, - {2, arcs_57_3}, -}; -static arc arcs_58_0[1] = { - {34, 1}, -}; -static arc arcs_58_1[1] = { - {109, 2}, -}; -static arc arcs_58_2[1] = { - {0, 2}, -}; -static state states_58[3] = { - {1, arcs_58_0}, +static state states_58[4] = { + {10, arcs_58_0}, {1, arcs_58_1}, {1, arcs_58_2}, + {2, arcs_58_3}, }; static arc arcs_59_0[1] = { - {133, 1}, + {34, 1}, }; -static arc arcs_59_1[2] = { - {134, 0}, - {0, 1}, +static arc arcs_59_1[1] = { + {110, 2}, }; -static state states_59[2] = { +static arc arcs_59_2[1] = { + {0, 2}, +}; +static state states_59[3] = { {1, arcs_59_0}, - {2, arcs_59_1}, + {1, arcs_59_1}, + {1, arcs_59_2}, }; static arc arcs_60_0[1] = { - {135, 1}, + {134, 1}, }; static arc arcs_60_1[2] = { - {136, 0}, + {135, 0}, {0, 1}, }; static state states_60[2] = { @@ -1411,10 +1424,10 @@ static state states_60[2] = { {2, arcs_60_1}, }; static arc arcs_61_0[1] = { - {137, 1}, + {136, 1}, }; static arc arcs_61_1[2] = { - {138, 0}, + {137, 0}, {0, 1}, }; static state states_61[2] = { @@ -1422,23 +1435,22 @@ static state states_61[2] = { {2, arcs_61_1}, }; static arc arcs_62_0[1] = { - {139, 1}, + {138, 1}, }; -static arc arcs_62_1[3] = { - {140, 0}, - {141, 0}, +static arc arcs_62_1[2] = { + {139, 0}, {0, 1}, }; static state states_62[2] = { {1, arcs_62_0}, - {3, arcs_62_1}, + {2, arcs_62_1}, }; static arc arcs_63_0[1] = { - {142, 1}, + {140, 1}, }; static arc arcs_63_1[3] = { - {143, 0}, - {144, 0}, + {141, 0}, + {142, 0}, {0, 1}, }; static state states_63[2] = { @@ -1446,645 +1458,657 @@ static state states_63[2] = { {3, arcs_63_1}, }; static arc arcs_64_0[1] = { - {145, 1}, + {143, 1}, +}; +static arc arcs_64_1[3] = { + {144, 0}, + {145, 0}, + {0, 1}, +}; +static state states_64[2] = { + {1, arcs_64_0}, + {3, arcs_64_1}, }; -static arc arcs_64_1[6] = { +static arc arcs_65_0[1] = { + {146, 1}, +}; +static arc arcs_65_1[6] = { {34, 0}, {11, 0}, - {146, 0}, {147, 0}, {148, 0}, + {149, 0}, {0, 1}, }; -static state states_64[2] = { - {1, arcs_64_0}, - {6, arcs_64_1}, +static state states_65[2] = { + {1, arcs_65_0}, + {6, arcs_65_1}, }; -static arc arcs_65_0[4] = { - {143, 1}, +static arc arcs_66_0[4] = { {144, 1}, - {149, 1}, - {150, 2}, + {145, 1}, + {150, 1}, + {151, 2}, }; -static arc arcs_65_1[1] = { - {145, 2}, +static arc arcs_66_1[1] = { + {146, 2}, }; -static arc arcs_65_2[1] = { +static arc arcs_66_2[1] = { {0, 2}, }; -static state states_65[3] = { - {4, arcs_65_0}, - {1, arcs_65_1}, - {1, arcs_65_2}, +static state states_66[3] = { + {4, arcs_66_0}, + {1, arcs_66_1}, + {1, arcs_66_2}, }; -static arc arcs_66_0[1] = { - {151, 1}, +static arc arcs_67_0[1] = { + {152, 1}, }; -static arc arcs_66_1[2] = { +static arc arcs_67_1[2] = { {35, 2}, {0, 1}, }; -static arc arcs_66_2[1] = { - {145, 3}, +static arc arcs_67_2[1] = { + {146, 3}, }; -static arc arcs_66_3[1] = { +static arc arcs_67_3[1] = { {0, 3}, }; -static state states_66[4] = { - {1, arcs_66_0}, - {2, arcs_66_1}, - {1, arcs_66_2}, - {1, arcs_66_3}, -}; -static arc arcs_67_0[2] = { - {152, 1}, - {153, 2}, +static state states_67[4] = { + {1, arcs_67_0}, + {2, arcs_67_1}, + {1, arcs_67_2}, + {1, arcs_67_3}, }; -static arc arcs_67_1[1] = { - {153, 2}, +static arc arcs_68_0[2] = { + {153, 1}, + {154, 2}, }; -static arc arcs_67_2[2] = { +static arc arcs_68_1[1] = { {154, 2}, +}; +static arc arcs_68_2[2] = { + {155, 2}, {0, 2}, }; -static state states_67[3] = { - {2, arcs_67_0}, - {1, arcs_67_1}, - {2, arcs_67_2}, +static state states_68[3] = { + {2, arcs_68_0}, + {1, arcs_68_1}, + {2, arcs_68_2}, }; -static arc arcs_68_0[10] = { +static arc arcs_69_0[10] = { {13, 1}, - {156, 2}, - {158, 3}, + {157, 2}, + {159, 3}, {23, 4}, - {161, 4}, - {162, 5}, + {162, 4}, + {163, 5}, {84, 4}, - {163, 4}, {164, 4}, {165, 4}, + {166, 4}, }; -static arc arcs_68_1[3] = { +static arc arcs_69_1[3] = { {51, 6}, - {155, 6}, + {156, 6}, {15, 4}, }; -static arc arcs_68_2[2] = { - {155, 7}, - {157, 4}, +static arc arcs_69_2[2] = { + {156, 7}, + {158, 4}, }; -static arc arcs_68_3[2] = { - {159, 8}, - {160, 4}, +static arc arcs_69_3[2] = { + {160, 8}, + {161, 4}, }; -static arc arcs_68_4[1] = { +static arc arcs_69_4[1] = { {0, 4}, }; -static arc arcs_68_5[2] = { - {162, 5}, +static arc arcs_69_5[2] = { + {163, 5}, {0, 5}, }; -static arc arcs_68_6[1] = { +static arc arcs_69_6[1] = { {15, 4}, }; -static arc arcs_68_7[1] = { - {157, 4}, +static arc arcs_69_7[1] = { + {158, 4}, }; -static arc arcs_68_8[1] = { - {160, 4}, +static arc arcs_69_8[1] = { + {161, 4}, }; -static state states_68[9] = { - {10, arcs_68_0}, - {3, arcs_68_1}, - {2, arcs_68_2}, - {2, arcs_68_3}, - {1, arcs_68_4}, - {2, arcs_68_5}, - {1, arcs_68_6}, - {1, arcs_68_7}, - {1, arcs_68_8}, -}; -static arc arcs_69_0[2] = { +static state states_69[9] = { + {10, arcs_69_0}, + {3, arcs_69_1}, + {2, arcs_69_2}, + {2, arcs_69_3}, + {1, arcs_69_4}, + {2, arcs_69_5}, + {1, arcs_69_6}, + {1, arcs_69_7}, + {1, arcs_69_8}, +}; +static arc arcs_70_0[2] = { {26, 1}, {52, 1}, }; -static arc arcs_69_1[3] = { - {166, 2}, +static arc arcs_70_1[3] = { + {167, 2}, {33, 3}, {0, 1}, }; -static arc arcs_69_2[1] = { +static arc arcs_70_2[1] = { {0, 2}, }; -static arc arcs_69_3[3] = { +static arc arcs_70_3[3] = { {26, 4}, {52, 4}, {0, 3}, }; -static arc arcs_69_4[2] = { +static arc arcs_70_4[2] = { {33, 3}, {0, 4}, }; -static state states_69[5] = { - {2, arcs_69_0}, - {3, arcs_69_1}, - {1, arcs_69_2}, - {3, arcs_69_3}, - {2, arcs_69_4}, +static state states_70[5] = { + {2, arcs_70_0}, + {3, arcs_70_1}, + {1, arcs_70_2}, + {3, arcs_70_3}, + {2, arcs_70_4}, }; -static arc arcs_70_0[3] = { +static arc arcs_71_0[3] = { {13, 1}, - {156, 2}, + {157, 2}, {83, 3}, }; -static arc arcs_70_1[2] = { +static arc arcs_71_1[2] = { {14, 4}, {15, 5}, }; -static arc arcs_70_2[1] = { - {167, 6}, +static arc arcs_71_2[1] = { + {168, 6}, }; -static arc arcs_70_3[1] = { +static arc arcs_71_3[1] = { {23, 5}, }; -static arc arcs_70_4[1] = { +static arc arcs_71_4[1] = { {15, 5}, }; -static arc arcs_70_5[1] = { +static arc arcs_71_5[1] = { {0, 5}, }; -static arc arcs_70_6[1] = { - {157, 5}, +static arc arcs_71_6[1] = { + {158, 5}, }; -static state states_70[7] = { - {3, arcs_70_0}, - {2, arcs_70_1}, - {1, arcs_70_2}, - {1, arcs_70_3}, - {1, arcs_70_4}, - {1, arcs_70_5}, - {1, arcs_70_6}, +static state states_71[7] = { + {3, arcs_71_0}, + {2, arcs_71_1}, + {1, arcs_71_2}, + {1, arcs_71_3}, + {1, arcs_71_4}, + {1, arcs_71_5}, + {1, arcs_71_6}, }; -static arc arcs_71_0[1] = { - {168, 1}, +static arc arcs_72_0[1] = { + {169, 1}, }; -static arc arcs_71_1[2] = { +static arc arcs_72_1[2] = { {33, 2}, {0, 1}, }; -static arc arcs_71_2[2] = { - {168, 1}, +static arc arcs_72_2[2] = { + {169, 1}, {0, 2}, }; -static state states_71[3] = { - {1, arcs_71_0}, - {2, arcs_71_1}, - {2, arcs_71_2}, +static state states_72[3] = { + {1, arcs_72_0}, + {2, arcs_72_1}, + {2, arcs_72_2}, }; -static arc arcs_72_0[2] = { +static arc arcs_73_0[2] = { {26, 1}, {27, 2}, }; -static arc arcs_72_1[2] = { +static arc arcs_73_1[2] = { {27, 2}, {0, 1}, }; -static arc arcs_72_2[3] = { +static arc arcs_73_2[3] = { {26, 3}, - {169, 4}, + {170, 4}, {0, 2}, }; -static arc arcs_72_3[2] = { - {169, 4}, +static arc arcs_73_3[2] = { + {170, 4}, {0, 3}, }; -static arc arcs_72_4[1] = { +static arc arcs_73_4[1] = { {0, 4}, }; -static state states_72[5] = { - {2, arcs_72_0}, - {2, arcs_72_1}, - {3, arcs_72_2}, - {2, arcs_72_3}, - {1, arcs_72_4}, +static state states_73[5] = { + {2, arcs_73_0}, + {2, arcs_73_1}, + {3, arcs_73_2}, + {2, arcs_73_3}, + {1, arcs_73_4}, }; -static arc arcs_73_0[1] = { +static arc arcs_74_0[1] = { {27, 1}, }; -static arc arcs_73_1[2] = { +static arc arcs_74_1[2] = { {26, 2}, {0, 1}, }; -static arc arcs_73_2[1] = { +static arc arcs_74_2[1] = { {0, 2}, }; -static state states_73[3] = { - {1, arcs_73_0}, - {2, arcs_73_1}, - {1, arcs_73_2}, +static state states_74[3] = { + {1, arcs_74_0}, + {2, arcs_74_1}, + {1, arcs_74_2}, }; -static arc arcs_74_0[2] = { - {109, 1}, +static arc arcs_75_0[2] = { + {110, 1}, {52, 1}, }; -static arc arcs_74_1[2] = { +static arc arcs_75_1[2] = { {33, 2}, {0, 1}, }; -static arc arcs_74_2[3] = { - {109, 1}, +static arc arcs_75_2[3] = { + {110, 1}, {52, 1}, {0, 2}, }; -static state states_74[3] = { - {2, arcs_74_0}, - {2, arcs_74_1}, - {3, arcs_74_2}, +static state states_75[3] = { + {2, arcs_75_0}, + {2, arcs_75_1}, + {3, arcs_75_2}, }; -static arc arcs_75_0[1] = { +static arc arcs_76_0[1] = { {26, 1}, }; -static arc arcs_75_1[2] = { +static arc arcs_76_1[2] = { {33, 2}, {0, 1}, }; -static arc arcs_75_2[2] = { +static arc arcs_76_2[2] = { {26, 1}, {0, 2}, }; -static state states_75[3] = { - {1, arcs_75_0}, - {2, arcs_75_1}, - {2, arcs_75_2}, +static state states_76[3] = { + {1, arcs_76_0}, + {2, arcs_76_1}, + {2, arcs_76_2}, }; -static arc arcs_76_0[3] = { +static arc arcs_77_0[3] = { {26, 1}, {35, 2}, {52, 3}, }; -static arc arcs_76_1[4] = { +static arc arcs_77_1[4] = { {27, 4}, - {166, 5}, + {167, 5}, {33, 6}, {0, 1}, }; -static arc arcs_76_2[1] = { - {109, 7}, +static arc arcs_77_2[1] = { + {110, 7}, }; -static arc arcs_76_3[3] = { - {166, 5}, +static arc arcs_77_3[3] = { + {167, 5}, {33, 6}, {0, 3}, }; -static arc arcs_76_4[1] = { +static arc arcs_77_4[1] = { {26, 7}, }; -static arc arcs_76_5[1] = { +static arc arcs_77_5[1] = { {0, 5}, }; -static arc arcs_76_6[3] = { +static arc arcs_77_6[3] = { {26, 8}, {52, 8}, {0, 6}, }; -static arc arcs_76_7[3] = { - {166, 5}, +static arc arcs_77_7[3] = { + {167, 5}, {33, 9}, {0, 7}, }; -static arc arcs_76_8[2] = { +static arc arcs_77_8[2] = { {33, 6}, {0, 8}, }; -static arc arcs_76_9[3] = { +static arc arcs_77_9[3] = { {26, 10}, {35, 11}, {0, 9}, }; -static arc arcs_76_10[1] = { +static arc arcs_77_10[1] = { {27, 12}, }; -static arc arcs_76_11[1] = { - {109, 13}, +static arc arcs_77_11[1] = { + {110, 13}, }; -static arc arcs_76_12[1] = { +static arc arcs_77_12[1] = { {26, 13}, }; -static arc arcs_76_13[2] = { +static arc arcs_77_13[2] = { {33, 9}, {0, 13}, }; -static state states_76[14] = { - {3, arcs_76_0}, - {4, arcs_76_1}, - {1, arcs_76_2}, - {3, arcs_76_3}, - {1, arcs_76_4}, - {1, arcs_76_5}, - {3, arcs_76_6}, - {3, arcs_76_7}, - {2, arcs_76_8}, - {3, arcs_76_9}, - {1, arcs_76_10}, - {1, arcs_76_11}, - {1, arcs_76_12}, - {2, arcs_76_13}, -}; -static arc arcs_77_0[1] = { - {170, 1}, -}; -static arc arcs_77_1[1] = { +static state states_77[14] = { + {3, arcs_77_0}, + {4, arcs_77_1}, + {1, arcs_77_2}, + {3, arcs_77_3}, + {1, arcs_77_4}, + {1, arcs_77_5}, + {3, arcs_77_6}, + {3, arcs_77_7}, + {2, arcs_77_8}, + {3, arcs_77_9}, + {1, arcs_77_10}, + {1, arcs_77_11}, + {1, arcs_77_12}, + {2, arcs_77_13}, +}; +static arc arcs_78_0[1] = { + {171, 1}, +}; +static arc arcs_78_1[1] = { {23, 2}, }; -static arc arcs_77_2[2] = { +static arc arcs_78_2[2] = { {13, 3}, {27, 4}, }; -static arc arcs_77_3[2] = { +static arc arcs_78_3[2] = { {14, 5}, {15, 6}, }; -static arc arcs_77_4[1] = { - {29, 7}, +static arc arcs_78_4[1] = { + {99, 7}, }; -static arc arcs_77_5[1] = { +static arc arcs_78_5[1] = { {15, 6}, }; -static arc arcs_77_6[1] = { +static arc arcs_78_6[1] = { {27, 4}, }; -static arc arcs_77_7[1] = { +static arc arcs_78_7[1] = { {0, 7}, }; -static state states_77[8] = { - {1, arcs_77_0}, - {1, arcs_77_1}, - {2, arcs_77_2}, - {2, arcs_77_3}, - {1, arcs_77_4}, - {1, arcs_77_5}, - {1, arcs_77_6}, - {1, arcs_77_7}, +static state states_78[8] = { + {1, arcs_78_0}, + {1, arcs_78_1}, + {2, arcs_78_2}, + {2, arcs_78_3}, + {1, arcs_78_4}, + {1, arcs_78_5}, + {1, arcs_78_6}, + {1, arcs_78_7}, }; -static arc arcs_78_0[1] = { - {171, 1}, +static arc arcs_79_0[1] = { + {172, 1}, }; -static arc arcs_78_1[2] = { +static arc arcs_79_1[2] = { {33, 2}, {0, 1}, }; -static arc arcs_78_2[2] = { - {171, 1}, +static arc arcs_79_2[2] = { + {172, 1}, {0, 2}, }; -static state states_78[3] = { - {1, arcs_78_0}, - {2, arcs_78_1}, - {2, arcs_78_2}, +static state states_79[3] = { + {1, arcs_79_0}, + {2, arcs_79_1}, + {2, arcs_79_2}, }; -static arc arcs_79_0[3] = { +static arc arcs_80_0[3] = { {26, 1}, {35, 2}, {34, 2}, }; -static arc arcs_79_1[3] = { - {166, 3}, +static arc arcs_80_1[3] = { + {167, 3}, {32, 2}, {0, 1}, }; -static arc arcs_79_2[1] = { +static arc arcs_80_2[1] = { {26, 3}, }; -static arc arcs_79_3[1] = { +static arc arcs_80_3[1] = { {0, 3}, }; -static state states_79[4] = { - {3, arcs_79_0}, - {3, arcs_79_1}, - {1, arcs_79_2}, - {1, arcs_79_3}, +static state states_80[4] = { + {3, arcs_80_0}, + {3, arcs_80_1}, + {1, arcs_80_2}, + {1, arcs_80_3}, }; -static arc arcs_80_0[2] = { - {166, 1}, - {173, 1}, +static arc arcs_81_0[2] = { + {167, 1}, + {174, 1}, }; -static arc arcs_80_1[1] = { +static arc arcs_81_1[1] = { {0, 1}, }; -static state states_80[2] = { - {2, arcs_80_0}, - {1, arcs_80_1}, +static state states_81[2] = { + {2, arcs_81_0}, + {1, arcs_81_1}, }; -static arc arcs_81_0[1] = { - {102, 1}, +static arc arcs_82_0[1] = { + {103, 1}, }; -static arc arcs_81_1[1] = { +static arc arcs_82_1[1] = { {67, 2}, }; -static arc arcs_81_2[1] = { - {103, 3}, +static arc arcs_82_2[1] = { + {104, 3}, }; -static arc arcs_81_3[1] = { - {113, 4}, +static arc arcs_82_3[1] = { + {114, 4}, }; -static arc arcs_81_4[2] = { - {172, 5}, +static arc arcs_82_4[2] = { + {173, 5}, {0, 4}, }; -static arc arcs_81_5[1] = { +static arc arcs_82_5[1] = { {0, 5}, }; -static state states_81[6] = { - {1, arcs_81_0}, - {1, arcs_81_1}, - {1, arcs_81_2}, - {1, arcs_81_3}, - {2, arcs_81_4}, - {1, arcs_81_5}, +static state states_82[6] = { + {1, arcs_82_0}, + {1, arcs_82_1}, + {1, arcs_82_2}, + {1, arcs_82_3}, + {2, arcs_82_4}, + {1, arcs_82_5}, }; -static arc arcs_82_0[2] = { +static arc arcs_83_0[2] = { {21, 1}, - {174, 2}, + {175, 2}, }; -static arc arcs_82_1[1] = { - {174, 2}, +static arc arcs_83_1[1] = { + {175, 2}, }; -static arc arcs_82_2[1] = { +static arc arcs_83_2[1] = { {0, 2}, }; -static state states_82[3] = { - {2, arcs_82_0}, - {1, arcs_82_1}, - {1, arcs_82_2}, +static state states_83[3] = { + {2, arcs_83_0}, + {1, arcs_83_1}, + {1, arcs_83_2}, }; -static arc arcs_83_0[1] = { +static arc arcs_84_0[1] = { {98, 1}, }; -static arc arcs_83_1[1] = { - {115, 2}, +static arc arcs_84_1[1] = { + {116, 2}, }; -static arc arcs_83_2[2] = { - {172, 3}, +static arc arcs_84_2[2] = { + {173, 3}, {0, 2}, }; -static arc arcs_83_3[1] = { +static arc arcs_84_3[1] = { {0, 3}, }; -static state states_83[4] = { - {1, arcs_83_0}, - {1, arcs_83_1}, - {2, arcs_83_2}, - {1, arcs_83_3}, +static state states_84[4] = { + {1, arcs_84_0}, + {1, arcs_84_1}, + {2, arcs_84_2}, + {1, arcs_84_3}, }; -static arc arcs_84_0[1] = { +static arc arcs_85_0[1] = { {23, 1}, }; -static arc arcs_84_1[1] = { +static arc arcs_85_1[1] = { {0, 1}, }; -static state states_84[2] = { - {1, arcs_84_0}, - {1, arcs_84_1}, +static state states_85[2] = { + {1, arcs_85_0}, + {1, arcs_85_1}, }; -static arc arcs_85_0[1] = { - {176, 1}, +static arc arcs_86_0[1] = { + {177, 1}, }; -static arc arcs_85_1[2] = { - {177, 2}, +static arc arcs_86_1[2] = { + {178, 2}, {0, 1}, }; -static arc arcs_85_2[1] = { +static arc arcs_86_2[1] = { {0, 2}, }; -static state states_85[3] = { - {1, arcs_85_0}, - {2, arcs_85_1}, - {1, arcs_85_2}, +static state states_86[3] = { + {1, arcs_86_0}, + {2, arcs_86_1}, + {1, arcs_86_2}, }; -static arc arcs_86_0[2] = { +static arc arcs_87_0[2] = { {78, 1}, {48, 2}, }; -static arc arcs_86_1[1] = { +static arc arcs_87_1[1] = { {26, 2}, }; -static arc arcs_86_2[1] = { +static arc arcs_87_2[1] = { {0, 2}, }; -static state states_86[3] = { - {2, arcs_86_0}, - {1, arcs_86_1}, - {1, arcs_86_2}, +static state states_87[3] = { + {2, arcs_87_0}, + {1, arcs_87_1}, + {1, arcs_87_2}, }; -static arc arcs_87_0[1] = { - {179, 1}, +static arc arcs_88_0[1] = { + {180, 1}, }; -static arc arcs_87_1[2] = { +static arc arcs_88_1[2] = { {2, 1}, {7, 2}, }; -static arc arcs_87_2[1] = { +static arc arcs_88_2[1] = { {0, 2}, }; -static state states_87[3] = { - {1, arcs_87_0}, - {2, arcs_87_1}, - {1, arcs_87_2}, +static state states_88[3] = { + {1, arcs_88_0}, + {2, arcs_88_1}, + {1, arcs_88_2}, }; -static arc arcs_88_0[1] = { +static arc arcs_89_0[1] = { {13, 1}, }; -static arc arcs_88_1[2] = { - {180, 2}, +static arc arcs_89_1[2] = { + {181, 2}, {15, 3}, }; -static arc arcs_88_2[1] = { +static arc arcs_89_2[1] = { {15, 3}, }; -static arc arcs_88_3[1] = { +static arc arcs_89_3[1] = { {25, 4}, }; -static arc arcs_88_4[1] = { +static arc arcs_89_4[1] = { {26, 5}, }; -static arc arcs_88_5[1] = { +static arc arcs_89_5[1] = { {0, 5}, }; -static state states_88[6] = { - {1, arcs_88_0}, - {2, arcs_88_1}, - {1, arcs_88_2}, - {1, arcs_88_3}, - {1, arcs_88_4}, - {1, arcs_88_5}, +static state states_89[6] = { + {1, arcs_89_0}, + {2, arcs_89_1}, + {1, arcs_89_2}, + {1, arcs_89_3}, + {1, arcs_89_4}, + {1, arcs_89_5}, }; -static arc arcs_89_0[3] = { +static arc arcs_90_0[3] = { {26, 1}, {34, 2}, {35, 3}, }; -static arc arcs_89_1[2] = { +static arc arcs_90_1[2] = { {33, 4}, {0, 1}, }; -static arc arcs_89_2[3] = { +static arc arcs_90_2[3] = { {26, 5}, {33, 6}, {0, 2}, }; -static arc arcs_89_3[1] = { +static arc arcs_90_3[1] = { {26, 7}, }; -static arc arcs_89_4[4] = { +static arc arcs_90_4[4] = { {26, 1}, {34, 8}, {35, 3}, {0, 4}, }; -static arc arcs_89_5[2] = { +static arc arcs_90_5[2] = { {33, 6}, {0, 5}, }; -static arc arcs_89_6[2] = { +static arc arcs_90_6[2] = { {26, 5}, {35, 3}, }; -static arc arcs_89_7[1] = { +static arc arcs_90_7[1] = { {0, 7}, }; -static arc arcs_89_8[3] = { +static arc arcs_90_8[3] = { {26, 9}, {33, 10}, {0, 8}, }; -static arc arcs_89_9[2] = { +static arc arcs_90_9[2] = { {33, 10}, {0, 9}, }; -static arc arcs_89_10[2] = { +static arc arcs_90_10[2] = { {26, 9}, {35, 3}, }; -static state states_89[11] = { - {3, arcs_89_0}, - {2, arcs_89_1}, - {3, arcs_89_2}, - {1, arcs_89_3}, - {4, arcs_89_4}, - {2, arcs_89_5}, - {2, arcs_89_6}, - {1, arcs_89_7}, - {3, arcs_89_8}, - {2, arcs_89_9}, - {2, arcs_89_10}, -}; -static dfa dfas[90] = { +static state states_90[11] = { + {3, arcs_90_0}, + {2, arcs_90_1}, + {3, arcs_90_2}, + {1, arcs_90_3}, + {4, arcs_90_4}, + {2, arcs_90_5}, + {2, arcs_90_6}, + {1, arcs_90_7}, + {3, arcs_90_8}, + {2, arcs_90_9}, + {2, arcs_90_10}, +}; +static dfa dfas[91] = { {256, "single_input", 0, 3, states_0, - "\004\050\340\000\004\000\000\000\024\174\022\016\144\011\040\004\000\200\041\121\076\004\001"}, + "\004\050\340\000\004\000\000\000\024\174\022\016\304\022\100\010\000\000\103\242\174\010\002"}, {257, "file_input", 0, 2, states_1, - "\204\050\340\000\004\000\000\000\024\174\022\016\144\011\040\004\000\200\041\121\076\004\001"}, + "\204\050\340\000\004\000\000\000\024\174\022\016\304\022\100\010\000\000\103\242\174\010\002"}, {258, "eval_input", 0, 3, states_2, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\100\010\000\000\103\242\174\000\000"}, {259, "decorator", 0, 7, states_3, "\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {260, "decorators", 0, 2, states_4, @@ -2106,17 +2130,17 @@ static dfa dfas[90] = { {268, "vfpdef", 0, 2, states_12, "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {269, "stmt", 0, 2, states_13, - "\000\050\340\000\004\000\000\000\024\174\022\016\144\011\040\004\000\200\041\121\076\004\001"}, + "\000\050\340\000\004\000\000\000\024\174\022\016\304\022\100\010\000\000\103\242\174\010\002"}, {270, "simple_stmt", 0, 4, states_14, - "\000\040\200\000\004\000\000\000\024\174\022\016\000\000\040\004\000\200\041\121\076\000\001"}, + "\000\040\200\000\004\000\000\000\024\174\022\016\000\000\100\010\000\000\103\242\174\000\002"}, {271, "small_stmt", 0, 2, states_15, - "\000\040\200\000\004\000\000\000\024\174\022\016\000\000\040\004\000\200\041\121\076\000\001"}, + "\000\040\200\000\004\000\000\000\024\174\022\016\000\000\100\010\000\000\103\242\174\000\002"}, {272, "expr_stmt", 0, 6, states_16, - "\000\040\200\000\004\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, + "\000\040\200\000\004\000\000\000\000\000\020\000\000\000\100\010\000\000\103\242\174\000\000"}, {273, "annassign", 0, 5, states_17, "\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {274, "testlist_star_expr", 0, 3, states_18, - "\000\040\200\000\004\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, + "\000\040\200\000\004\000\000\000\000\000\020\000\000\000\100\010\000\000\103\242\174\000\000"}, {275, "augassign", 0, 2, states_19, "\000\000\000\000\000\000\340\377\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {276, "del_stmt", 0, 3, states_20, @@ -2124,7 +2148,7 @@ static dfa dfas[90] = { {277, "pass_stmt", 0, 2, states_21, "\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {278, "flow_stmt", 0, 2, states_22, - "\000\000\000\000\000\000\000\000\000\074\000\000\000\000\000\000\000\000\000\000\000\000\001"}, + "\000\000\000\000\000\000\000\000\000\074\000\000\000\000\000\000\000\000\000\000\000\000\002"}, {279, "break_stmt", 0, 2, states_23, "\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {280, "continue_stmt", 0, 2, states_24, @@ -2132,7 +2156,7 @@ static dfa dfas[90] = { {281, "return_stmt", 0, 3, states_25, "\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {282, "yield_stmt", 0, 2, states_26, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002"}, {283, "raise_stmt", 0, 5, states_27, "\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {284, "import_stmt", 0, 2, states_28, @@ -2158,109 +2182,111 @@ static dfa dfas[90] = { {294, "assert_stmt", 0, 5, states_38, "\000\000\000\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000"}, {295, "compound_stmt", 0, 2, states_39, - "\000\010\140\000\000\000\000\000\000\000\000\000\144\011\000\000\000\000\000\000\000\004\000"}, + "\000\010\140\000\000\000\000\000\000\000\000\000\304\022\000\000\000\000\000\000\000\010\000"}, {296, "async_stmt", 0, 3, states_40, "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {297, "if_stmt", 0, 8, states_41, "\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000"}, {298, "while_stmt", 0, 8, states_42, - "\000\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000"}, - {299, "for_stmt", 0, 11, states_43, "\000\000\000\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000"}, + {299, "for_stmt", 0, 11, states_43, + "\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000"}, {300, "try_stmt", 0, 13, states_44, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000"}, {301, "with_stmt", 0, 6, states_45, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000"}, {302, "with_item", 0, 4, states_46, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\100\010\000\000\103\242\174\000\000"}, {303, "except_clause", 0, 5, states_47, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000"}, - {304, "suite", 0, 7, states_48, - "\004\040\200\000\004\000\000\000\024\174\022\016\000\000\040\004\000\200\041\121\076\000\001"}, - {305, "test", 0, 6, states_49, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, - {306, "test_nocond", 0, 2, states_50, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, - {307, "lambdef", 0, 5, states_51, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000"}, - {308, "lambdef_nocond", 0, 5, states_52, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000"}, - {309, "or_test", 0, 2, states_53, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\004\000\200\041\121\076\000\000"}, - {310, "and_test", 0, 2, states_54, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\004\000\200\041\121\076\000\000"}, - {311, "not_test", 0, 3, states_55, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\004\000\200\041\121\076\000\000"}, - {312, "comparison", 0, 2, states_56, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\200\041\121\076\000\000"}, - {313, "comp_op", 0, 4, states_57, - "\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\344\037\000\000\000\000\000\000"}, - {314, "star_expr", 0, 3, states_58, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000"}, + {304, "func_body_suite", 0, 7, states_48, + "\004\040\200\000\004\000\000\000\024\174\022\016\000\000\100\010\000\000\103\242\174\000\002"}, + {305, "suite", 0, 5, states_49, + "\004\040\200\000\004\000\000\000\024\174\022\016\000\000\100\010\000\000\103\242\174\000\002"}, + {306, "test", 0, 6, states_50, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\100\010\000\000\103\242\174\000\000"}, + {307, "test_nocond", 0, 2, states_51, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\100\010\000\000\103\242\174\000\000"}, + {308, "lambdef", 0, 5, states_52, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000"}, + {309, "lambdef_nocond", 0, 5, states_53, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000"}, + {310, "or_test", 0, 2, states_54, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\010\000\000\103\242\174\000\000"}, + {311, "and_test", 0, 2, states_55, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\010\000\000\103\242\174\000\000"}, + {312, "not_test", 0, 3, states_56, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\010\000\000\103\242\174\000\000"}, + {313, "comparison", 0, 2, states_57, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\103\242\174\000\000"}, + {314, "comp_op", 0, 4, states_58, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\310\077\000\000\000\000\000\000"}, + {315, "star_expr", 0, 3, states_59, "\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {315, "expr", 0, 2, states_59, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\200\041\121\076\000\000"}, - {316, "xor_expr", 0, 2, states_60, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\200\041\121\076\000\000"}, - {317, "and_expr", 0, 2, states_61, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\200\041\121\076\000\000"}, - {318, "shift_expr", 0, 2, states_62, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\200\041\121\076\000\000"}, - {319, "arith_expr", 0, 2, states_63, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\200\041\121\076\000\000"}, - {320, "term", 0, 2, states_64, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\200\041\121\076\000\000"}, - {321, "factor", 0, 3, states_65, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\200\041\121\076\000\000"}, - {322, "power", 0, 4, states_66, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\121\076\000\000"}, - {323, "atom_expr", 0, 3, states_67, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\121\076\000\000"}, - {324, "atom", 0, 9, states_68, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\120\076\000\000"}, - {325, "testlist_comp", 0, 5, states_69, - "\000\040\200\000\004\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, - {326, "trailer", 0, 7, states_70, - "\000\040\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\020\000\000\000"}, - {327, "subscriptlist", 0, 3, states_71, - "\000\040\200\010\000\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, - {328, "subscript", 0, 5, states_72, - "\000\040\200\010\000\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, - {329, "sliceop", 0, 3, states_73, + {316, "expr", 0, 2, states_60, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\103\242\174\000\000"}, + {317, "xor_expr", 0, 2, states_61, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\103\242\174\000\000"}, + {318, "and_expr", 0, 2, states_62, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\103\242\174\000\000"}, + {319, "shift_expr", 0, 2, states_63, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\103\242\174\000\000"}, + {320, "arith_expr", 0, 2, states_64, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\103\242\174\000\000"}, + {321, "term", 0, 2, states_65, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\103\242\174\000\000"}, + {322, "factor", 0, 3, states_66, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\103\242\174\000\000"}, + {323, "power", 0, 4, states_67, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\242\174\000\000"}, + {324, "atom_expr", 0, 3, states_68, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\242\174\000\000"}, + {325, "atom", 0, 9, states_69, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\240\174\000\000"}, + {326, "testlist_comp", 0, 5, states_70, + "\000\040\200\000\004\000\000\000\000\000\020\000\000\000\100\010\000\000\103\242\174\000\000"}, + {327, "trailer", 0, 7, states_71, + "\000\040\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\040\000\000\000"}, + {328, "subscriptlist", 0, 3, states_72, + "\000\040\200\010\000\000\000\000\000\000\020\000\000\000\100\010\000\000\103\242\174\000\000"}, + {329, "subscript", 0, 5, states_73, + "\000\040\200\010\000\000\000\000\000\000\020\000\000\000\100\010\000\000\103\242\174\000\000"}, + {330, "sliceop", 0, 3, states_74, "\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {330, "exprlist", 0, 3, states_74, - "\000\040\200\000\004\000\000\000\000\000\020\000\000\000\000\000\000\200\041\121\076\000\000"}, - {331, "testlist", 0, 3, states_75, - "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, - {332, "dictorsetmaker", 0, 14, states_76, - "\000\040\200\000\014\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, - {333, "classdef", 0, 8, states_77, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000"}, - {334, "arglist", 0, 3, states_78, - "\000\040\200\000\014\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, - {335, "argument", 0, 4, states_79, - "\000\040\200\000\014\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, - {336, "comp_iter", 0, 2, states_80, - "\000\000\040\000\000\000\000\000\000\000\000\000\104\000\000\000\000\000\000\000\000\000\000"}, - {337, "sync_comp_for", 0, 6, states_81, - "\000\000\000\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000"}, - {338, "comp_for", 0, 3, states_82, - "\000\000\040\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000"}, - {339, "comp_if", 0, 4, states_83, + {331, "exprlist", 0, 3, states_75, + "\000\040\200\000\004\000\000\000\000\000\020\000\000\000\000\000\000\000\103\242\174\000\000"}, + {332, "testlist", 0, 3, states_76, + "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\100\010\000\000\103\242\174\000\000"}, + {333, "dictorsetmaker", 0, 14, states_77, + "\000\040\200\000\014\000\000\000\000\000\020\000\000\000\100\010\000\000\103\242\174\000\000"}, + {334, "classdef", 0, 8, states_78, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\010\000"}, + {335, "arglist", 0, 3, states_79, + "\000\040\200\000\014\000\000\000\000\000\020\000\000\000\100\010\000\000\103\242\174\000\000"}, + {336, "argument", 0, 4, states_80, + "\000\040\200\000\014\000\000\000\000\000\020\000\000\000\100\010\000\000\103\242\174\000\000"}, + {337, "comp_iter", 0, 2, states_81, + "\000\000\040\000\000\000\000\000\000\000\000\000\204\000\000\000\000\000\000\000\000\000\000"}, + {338, "sync_comp_for", 0, 6, states_82, + "\000\000\000\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000"}, + {339, "comp_for", 0, 3, states_83, + "\000\000\040\000\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000"}, + {340, "comp_if", 0, 4, states_84, "\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000"}, - {340, "encoding_decl", 0, 2, states_84, + {341, "encoding_decl", 0, 2, states_85, "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {341, "yield_expr", 0, 3, states_85, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001"}, - {342, "yield_arg", 0, 3, states_86, - "\000\040\200\000\004\000\000\000\000\100\020\000\000\000\040\004\000\200\041\121\076\000\000"}, - {343, "func_type_input", 0, 3, states_87, + {342, "yield_expr", 0, 3, states_86, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002"}, + {343, "yield_arg", 0, 3, states_87, + "\000\040\200\000\004\000\000\000\000\100\020\000\000\000\100\010\000\000\103\242\174\000\000"}, + {344, "func_type_input", 0, 3, states_88, "\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {344, "func_type", 0, 6, states_88, + {345, "func_type", 0, 6, states_89, "\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {345, "typelist", 0, 11, states_89, - "\000\040\200\000\014\000\000\000\000\000\020\000\000\000\040\004\000\200\041\121\076\000\000"}, + {346, "typelist", 0, 11, states_90, + "\000\040\200\000\014\000\000\000\000\000\020\000\000\000\100\010\000\000\103\242\174\000\000"}, }; -static label labels[181] = { +static label labels[182] = { {0, "EMPTY"}, {256, 0}, {4, 0}, @@ -2270,16 +2296,16 @@ static label labels[181] = { {269, 0}, {0, 0}, {258, 0}, - {331, 0}, + {332, 0}, {259, 0}, {49, 0}, {291, 0}, {7, 0}, - {334, 0}, + {335, 0}, {8, 0}, {260, 0}, {261, 0}, - {333, 0}, + {334, 0}, {263, 0}, {262, 0}, {1, "async"}, @@ -2287,7 +2313,7 @@ static label labels[181] = { {1, 0}, {264, 0}, {51, 0}, - {305, 0}, + {306, 0}, {11, 0}, {55, 0}, {304, 0}, @@ -2312,8 +2338,8 @@ static label labels[181] = { {274, 0}, {273, 0}, {275, 0}, - {341, 0}, - {314, 0}, + {342, 0}, + {315, 0}, {36, 0}, {37, 0}, {38, 0}, @@ -2328,7 +2354,7 @@ static label labels[181] = { {46, 0}, {48, 0}, {1, "del"}, - {330, 0}, + {331, 0}, {1, "pass"}, {279, 0}, {280, 0}, @@ -2360,6 +2386,7 @@ static label labels[181] = { {301, 0}, {296, 0}, {1, "if"}, + {305, 0}, {1, "elif"}, {1, "else"}, {1, "while"}, @@ -2370,22 +2397,22 @@ static label labels[181] = { {1, "finally"}, {1, "with"}, {302, 0}, - {315, 0}, + {316, 0}, {1, "except"}, {5, 0}, {6, 0}, - {309, 0}, - {307, 0}, - {306, 0}, + {310, 0}, {308, 0}, + {307, 0}, + {309, 0}, {1, "lambda"}, - {310, 0}, - {1, "or"}, {311, 0}, + {1, "or"}, + {312, 0}, {1, "and"}, {1, "not"}, - {312, 0}, {313, 0}, + {314, 0}, {20, 0}, {21, 0}, {27, 0}, @@ -2394,58 +2421,58 @@ static label labels[181] = { {28, 0}, {28, 0}, {1, "is"}, - {316, 0}, - {18, 0}, {317, 0}, - {32, 0}, + {18, 0}, {318, 0}, - {19, 0}, + {32, 0}, {319, 0}, + {19, 0}, + {320, 0}, {33, 0}, {34, 0}, - {320, 0}, + {321, 0}, {14, 0}, {15, 0}, - {321, 0}, + {322, 0}, {17, 0}, {24, 0}, {47, 0}, {31, 0}, - {322, 0}, {323, 0}, - {1, "await"}, {324, 0}, - {326, 0}, + {1, "await"}, {325, 0}, + {327, 0}, + {326, 0}, {9, 0}, {10, 0}, {25, 0}, - {332, 0}, + {333, 0}, {26, 0}, {2, 0}, {3, 0}, {1, "None"}, {1, "True"}, {1, "False"}, - {338, 0}, - {327, 0}, + {339, 0}, {328, 0}, {329, 0}, + {330, 0}, {1, "class"}, - {335, 0}, {336, 0}, - {339, 0}, {337, 0}, {340, 0}, + {338, 0}, + {341, 0}, {1, "yield"}, - {342, 0}, {343, 0}, {344, 0}, {345, 0}, + {346, 0}, }; grammar _PyParser_Grammar = { - 90, + 91, dfas, - {181, labels}, + {182, labels}, 256 }; From 6d1f1de6e6c14a9a505c1cb6ff69c102d047b16a Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 22 Jan 2019 21:15:23 -0800 Subject: [PATCH 20/46] Regen Lib/symbol.py (again) --- Lib/symbol.py | 85 ++++++++++++++++++++++++++------------------------- 1 file changed, 43 insertions(+), 42 deletions(-) diff --git a/Lib/symbol.py b/Lib/symbol.py index 3a52d809790112..e089053e318fe8 100644 --- a/Lib/symbol.py +++ b/Lib/symbol.py @@ -60,48 +60,49 @@ with_stmt = 301 with_item = 302 except_clause = 303 -suite = 304 -test = 305 -test_nocond = 306 -lambdef = 307 -lambdef_nocond = 308 -or_test = 309 -and_test = 310 -not_test = 311 -comparison = 312 -comp_op = 313 -star_expr = 314 -expr = 315 -xor_expr = 316 -and_expr = 317 -shift_expr = 318 -arith_expr = 319 -term = 320 -factor = 321 -power = 322 -atom_expr = 323 -atom = 324 -testlist_comp = 325 -trailer = 326 -subscriptlist = 327 -subscript = 328 -sliceop = 329 -exprlist = 330 -testlist = 331 -dictorsetmaker = 332 -classdef = 333 -arglist = 334 -argument = 335 -comp_iter = 336 -sync_comp_for = 337 -comp_for = 338 -comp_if = 339 -encoding_decl = 340 -yield_expr = 341 -yield_arg = 342 -func_type_input = 343 -func_type = 344 -typelist = 345 +func_body_suite = 304 +suite = 305 +test = 306 +test_nocond = 307 +lambdef = 308 +lambdef_nocond = 309 +or_test = 310 +and_test = 311 +not_test = 312 +comparison = 313 +comp_op = 314 +star_expr = 315 +expr = 316 +xor_expr = 317 +and_expr = 318 +shift_expr = 319 +arith_expr = 320 +term = 321 +factor = 322 +power = 323 +atom_expr = 324 +atom = 325 +testlist_comp = 326 +trailer = 327 +subscriptlist = 328 +subscript = 329 +sliceop = 330 +exprlist = 331 +testlist = 332 +dictorsetmaker = 333 +classdef = 334 +arglist = 335 +argument = 336 +comp_iter = 337 +sync_comp_for = 338 +comp_for = 339 +comp_if = 340 +encoding_decl = 341 +yield_expr = 342 +yield_arg = 343 +func_type_input = 344 +func_type = 345 +typelist = 346 #--end constants-- sym_name = {} From 567f34132194ef45e90aa8b440a5c89bebc84f2c Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Wed, 23 Jan 2019 11:18:37 -0800 Subject: [PATCH 21/46] Fix assert in ast_for_suite() -- n can be a func_body_suite too now --- Python/ast.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Python/ast.c b/Python/ast.c index b91c2bbc0462d9..6aa46e34014a9f 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -3674,7 +3674,9 @@ ast_for_suite(struct compiling *c, const node *n) int i, total, num, end, pos = 0; node *ch; - REQ(n, suite); + if (TYPE(n) != func_body_suite) { + REQ(n, suite); + } total = num_stmts(n); seq = _Py_asdl_seq_new(total, c->c_arena); From 5d365583ee3720aa5d83590faa6cbcb77f151bae Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Wed, 23 Jan 2019 11:58:41 -0800 Subject: [PATCH 22/46] A better hack for IndentationError This is fragile -- it just substitutes 'suite' when 'func_body_suite' is found but type comments are off. --- Parser/parser.c | 10 ++++++++-- Parser/parsetok.c | 2 ++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Parser/parser.c b/Parser/parser.c index a9916d392aabb2..b082afca27b624 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -12,6 +12,7 @@ #include "node.h" #include "parser.h" #include "errcode.h" +#include "graminit.h" #ifdef Py_DEBUG @@ -260,7 +261,12 @@ PyParser_AddToken(parser_state *ps, int type, char *str, /* Push non-terminal */ int nt = (x >> 8) + NT_OFFSET; int arrow = x & ((1<<7)-1); - dfa *d1 = PyGrammar_FindDFA( + dfa *d1; + if (nt == func_body_suite && !(ps->p_flags & PyCF_TYPE_COMMENTS)) { + D(printf(" [switch func_body_suite to suite]")); + nt = suite; + } + d1 = PyGrammar_FindDFA( ps->p_grammar, nt); if ((err = push(&ps->p_stack, nt, d1, arrow, lineno, col_offset, @@ -268,7 +274,7 @@ PyParser_AddToken(parser_state *ps, int type, char *str, D(printf(" MemError: push\n")); return err; } - D(printf(" Push ...\n")); + D(printf(" Push '%s'\n", d1->d_name)); continue; } diff --git a/Parser/parsetok.c b/Parser/parsetok.c index c543353ecd5caa..6fcf91570176fb 100644 --- a/Parser/parsetok.c +++ b/Parser/parsetok.c @@ -245,6 +245,8 @@ parsetok(struct tok_state *tok, grammar *g, int start, perrdetail *err_ret, #ifdef PY_PARSER_REQUIRES_FUTURE_KEYWORD if (*flags & PyPARSE_BARRY_AS_BDFL) ps->p_flags |= CO_FUTURE_BARRY_AS_BDFL; + if (*flags & PyPARSE_TYPE_COMMENTS) + ps->p_flags |= PyCF_TYPE_COMMENTS; #endif for (;;) { From 308df83ccc9add2e777d0d2390b75c4346c05794 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 25 Jan 2019 11:37:09 -0800 Subject: [PATCH 23/46] Move func_body_suite towards the end of Grammar to stabilize symbol numbering --- Grammar/Grammar | 5 +- Include/graminit.h | 82 ++--- Lib/symbol.py | 11 +- Python/graminit.c | 886 ++++++++++++++++++++++----------------------- 4 files changed, 493 insertions(+), 491 deletions(-) diff --git a/Grammar/Grammar b/Grammar/Grammar index 9965b3bb9f5253..7f736711ee016f 100644 --- a/Grammar/Grammar +++ b/Grammar/Grammar @@ -84,8 +84,6 @@ with_stmt: 'with' with_item (',' with_item)* ':' [TYPE_COMMENT] suite with_item: test ['as' expr] # NB compile.c makes sure that the default except clause is last except_clause: 'except' [test ['as' NAME]] -# the TYPE_COMMENT in suites is only parsed for funcdefs, but can't go elsewhere due to ambiguity -func_body_suite: simple_stmt | NEWLINE [TYPE_COMMENT NEWLINE] INDENT stmt+ DEDENT suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT namedexpr_test: test [':=' test] @@ -156,6 +154,9 @@ encoding_decl: NAME yield_expr: 'yield' [yield_arg] yield_arg: 'from' test | testlist_star_expr +# the TYPE_COMMENT in suites is only parsed for funcdefs, but can't go elsewhere due to ambiguity +func_body_suite: simple_stmt | NEWLINE [TYPE_COMMENT NEWLINE] INDENT stmt+ DEDENT + func_type_input: func_type NEWLINE* ENDMARKER func_type: '(' [typelist] ')' '->' test # typelist is a modified typedargslist (see above) diff --git a/Include/graminit.h b/Include/graminit.h index c85e31b84bb65f..d1027b7a743f24 100644 --- a/Include/graminit.h +++ b/Include/graminit.h @@ -48,47 +48,47 @@ #define with_stmt 301 #define with_item 302 #define except_clause 303 -#define func_body_suite 304 -#define suite 305 -#define namedexpr_test 306 -#define test 307 -#define test_nocond 308 -#define lambdef 309 -#define lambdef_nocond 310 -#define or_test 311 -#define and_test 312 -#define not_test 313 -#define comparison 314 -#define comp_op 315 -#define star_expr 316 -#define expr 317 -#define xor_expr 318 -#define and_expr 319 -#define shift_expr 320 -#define arith_expr 321 -#define term 322 -#define factor 323 -#define power 324 -#define atom_expr 325 -#define atom 326 -#define testlist_comp 327 -#define trailer 328 -#define subscriptlist 329 -#define subscript 330 -#define sliceop 331 -#define exprlist 332 -#define testlist 333 -#define dictorsetmaker 334 -#define classdef 335 -#define arglist 336 -#define argument 337 -#define comp_iter 338 -#define sync_comp_for 339 -#define comp_for 340 -#define comp_if 341 -#define encoding_decl 342 -#define yield_expr 343 -#define yield_arg 344 +#define suite 304 +#define namedexpr_test 305 +#define test 306 +#define test_nocond 307 +#define lambdef 308 +#define lambdef_nocond 309 +#define or_test 310 +#define and_test 311 +#define not_test 312 +#define comparison 313 +#define comp_op 314 +#define star_expr 315 +#define expr 316 +#define xor_expr 317 +#define and_expr 318 +#define shift_expr 319 +#define arith_expr 320 +#define term 321 +#define factor 322 +#define power 323 +#define atom_expr 324 +#define atom 325 +#define testlist_comp 326 +#define trailer 327 +#define subscriptlist 328 +#define subscript 329 +#define sliceop 330 +#define exprlist 331 +#define testlist 332 +#define dictorsetmaker 333 +#define classdef 334 +#define arglist 335 +#define argument 336 +#define comp_iter 337 +#define sync_comp_for 338 +#define comp_for 339 +#define comp_if 340 +#define encoding_decl 341 +#define yield_expr 342 +#define yield_arg 343 +#define func_body_suite 344 #define func_type_input 345 #define func_type 346 #define typelist 347 diff --git a/Lib/symbol.py b/Lib/symbol.py index e089053e318fe8..36e0eec7ac1f5d 100644 --- a/Lib/symbol.py +++ b/Lib/symbol.py @@ -60,8 +60,8 @@ with_stmt = 301 with_item = 302 except_clause = 303 -func_body_suite = 304 -suite = 305 +suite = 304 +namedexpr_test = 305 test = 306 test_nocond = 307 lambdef = 308 @@ -100,9 +100,10 @@ encoding_decl = 341 yield_expr = 342 yield_arg = 343 -func_type_input = 344 -func_type = 345 -typelist = 346 +func_body_suite = 344 +func_type_input = 345 +func_type = 346 +typelist = 347 #--end constants-- sym_name = {} diff --git a/Python/graminit.c b/Python/graminit.c index c58231000d9d54..516eca85b1a50f 100644 --- a/Python/graminit.c +++ b/Python/graminit.c @@ -1188,113 +1188,103 @@ static arc arcs_48_0[2] = { static arc arcs_48_1[1] = { {0, 1}, }; -static arc arcs_48_2[2] = { - {28, 3}, - {113, 4}, +static arc arcs_48_2[1] = { + {113, 3}, }; static arc arcs_48_3[1] = { - {2, 5}, -}; -static arc arcs_48_4[1] = { - {6, 6}, -}; -static arc arcs_48_5[1] = { - {113, 4}, + {6, 4}, }; -static arc arcs_48_6[2] = { - {6, 6}, +static arc arcs_48_4[2] = { + {6, 4}, {114, 1}, }; -static state states_48[7] = { +static state states_48[5] = { {2, arcs_48_0}, {1, arcs_48_1}, - {2, arcs_48_2}, + {1, arcs_48_2}, {1, arcs_48_3}, - {1, arcs_48_4}, - {1, arcs_48_5}, - {2, arcs_48_6}, + {2, arcs_48_4}, }; -static arc arcs_49_0[2] = { - {3, 1}, - {2, 2}, +static arc arcs_49_0[1] = { + {26, 1}, }; -static arc arcs_49_1[1] = { +static arc arcs_49_1[2] = { + {115, 2}, {0, 1}, }; static arc arcs_49_2[1] = { - {113, 3}, + {26, 3}, }; static arc arcs_49_3[1] = { - {6, 4}, -}; -static arc arcs_49_4[2] = { - {6, 4}, - {114, 1}, + {0, 3}, }; -static state states_49[5] = { - {2, arcs_49_0}, - {1, arcs_49_1}, +static state states_49[4] = { + {1, arcs_49_0}, + {2, arcs_49_1}, {1, arcs_49_2}, {1, arcs_49_3}, - {2, arcs_49_4}, }; -static arc arcs_50_0[1] = { - {26, 1}, +static arc arcs_50_0[2] = { + {116, 1}, + {117, 2}, }; static arc arcs_50_1[2] = { - {115, 2}, + {98, 3}, {0, 1}, }; static arc arcs_50_2[1] = { - {26, 3}, + {0, 2}, }; static arc arcs_50_3[1] = { - {0, 3}, + {116, 4}, }; -static state states_50[4] = { - {1, arcs_50_0}, +static arc arcs_50_4[1] = { + {102, 5}, +}; +static arc arcs_50_5[1] = { + {26, 2}, +}; +static state states_50[6] = { + {2, arcs_50_0}, {2, arcs_50_1}, {1, arcs_50_2}, {1, arcs_50_3}, + {1, arcs_50_4}, + {1, arcs_50_5}, }; static arc arcs_51_0[2] = { {116, 1}, - {117, 2}, + {119, 1}, }; -static arc arcs_51_1[2] = { - {98, 3}, +static arc arcs_51_1[1] = { {0, 1}, }; -static arc arcs_51_2[1] = { - {0, 2}, -}; -static arc arcs_51_3[1] = { - {116, 4}, +static state states_51[2] = { + {2, arcs_51_0}, + {1, arcs_51_1}, }; -static arc arcs_51_4[1] = { - {102, 5}, +static arc arcs_52_0[1] = { + {120, 1}, }; -static arc arcs_51_5[1] = { - {26, 2}, +static arc arcs_52_1[2] = { + {36, 2}, + {27, 3}, }; -static state states_51[6] = { - {2, arcs_51_0}, - {2, arcs_51_1}, - {1, arcs_51_2}, - {1, arcs_51_3}, - {1, arcs_51_4}, - {1, arcs_51_5}, +static arc arcs_52_2[1] = { + {27, 3}, }; -static arc arcs_52_0[2] = { - {116, 1}, - {119, 1}, +static arc arcs_52_3[1] = { + {26, 4}, }; -static arc arcs_52_1[1] = { - {0, 1}, +static arc arcs_52_4[1] = { + {0, 4}, }; -static state states_52[2] = { - {2, arcs_52_0}, - {1, arcs_52_1}, +static state states_52[5] = { + {1, arcs_52_0}, + {2, arcs_52_1}, + {1, arcs_52_2}, + {1, arcs_52_3}, + {1, arcs_52_4}, }; static arc arcs_53_0[1] = { {120, 1}, @@ -1307,7 +1297,7 @@ static arc arcs_53_2[1] = { {27, 3}, }; static arc arcs_53_3[1] = { - {26, 4}, + {118, 4}, }; static arc arcs_53_4[1] = { {0, 4}, @@ -1320,77 +1310,54 @@ static state states_53[5] = { {1, arcs_53_4}, }; static arc arcs_54_0[1] = { - {120, 1}, + {121, 1}, }; static arc arcs_54_1[2] = { - {36, 2}, - {27, 3}, -}; -static arc arcs_54_2[1] = { - {27, 3}, -}; -static arc arcs_54_3[1] = { - {118, 4}, -}; -static arc arcs_54_4[1] = { - {0, 4}, + {122, 0}, + {0, 1}, }; -static state states_54[5] = { +static state states_54[2] = { {1, arcs_54_0}, {2, arcs_54_1}, - {1, arcs_54_2}, - {1, arcs_54_3}, - {1, arcs_54_4}, }; static arc arcs_55_0[1] = { - {121, 1}, + {123, 1}, }; static arc arcs_55_1[2] = { - {122, 0}, + {124, 0}, {0, 1}, }; static state states_55[2] = { {1, arcs_55_0}, {2, arcs_55_1}, }; -static arc arcs_56_0[1] = { - {123, 1}, -}; -static arc arcs_56_1[2] = { - {124, 0}, - {0, 1}, -}; -static state states_56[2] = { - {1, arcs_56_0}, - {2, arcs_56_1}, -}; -static arc arcs_57_0[2] = { +static arc arcs_56_0[2] = { {125, 1}, {126, 2}, }; -static arc arcs_57_1[1] = { +static arc arcs_56_1[1] = { {123, 2}, }; -static arc arcs_57_2[1] = { +static arc arcs_56_2[1] = { {0, 2}, }; -static state states_57[3] = { - {2, arcs_57_0}, - {1, arcs_57_1}, - {1, arcs_57_2}, +static state states_56[3] = { + {2, arcs_56_0}, + {1, arcs_56_1}, + {1, arcs_56_2}, }; -static arc arcs_58_0[1] = { +static arc arcs_57_0[1] = { {111, 1}, }; -static arc arcs_58_1[2] = { +static arc arcs_57_1[2] = { {127, 0}, {0, 1}, }; -static state states_58[2] = { - {1, arcs_58_0}, - {2, arcs_58_1}, +static state states_57[2] = { + {1, arcs_57_0}, + {2, arcs_57_1}, }; -static arc arcs_59_0[10] = { +static arc arcs_58_0[10] = { {128, 1}, {129, 1}, {130, 1}, @@ -1402,41 +1369,52 @@ static arc arcs_59_0[10] = { {125, 2}, {135, 3}, }; -static arc arcs_59_1[1] = { +static arc arcs_58_1[1] = { {0, 1}, }; -static arc arcs_59_2[1] = { +static arc arcs_58_2[1] = { {105, 1}, }; -static arc arcs_59_3[2] = { +static arc arcs_58_3[2] = { {125, 1}, {0, 3}, }; -static state states_59[4] = { - {10, arcs_59_0}, - {1, arcs_59_1}, - {1, arcs_59_2}, - {2, arcs_59_3}, +static state states_58[4] = { + {10, arcs_58_0}, + {1, arcs_58_1}, + {1, arcs_58_2}, + {2, arcs_58_3}, }; -static arc arcs_60_0[1] = { +static arc arcs_59_0[1] = { {34, 1}, }; -static arc arcs_60_1[1] = { +static arc arcs_59_1[1] = { {111, 2}, }; -static arc arcs_60_2[1] = { +static arc arcs_59_2[1] = { {0, 2}, }; -static state states_60[3] = { +static state states_59[3] = { + {1, arcs_59_0}, + {1, arcs_59_1}, + {1, arcs_59_2}, +}; +static arc arcs_60_0[1] = { + {136, 1}, +}; +static arc arcs_60_1[2] = { + {137, 0}, + {0, 1}, +}; +static state states_60[2] = { {1, arcs_60_0}, - {1, arcs_60_1}, - {1, arcs_60_2}, + {2, arcs_60_1}, }; static arc arcs_61_0[1] = { - {136, 1}, + {138, 1}, }; static arc arcs_61_1[2] = { - {137, 0}, + {139, 0}, {0, 1}, }; static state states_61[2] = { @@ -1444,10 +1422,10 @@ static state states_61[2] = { {2, arcs_61_1}, }; static arc arcs_62_0[1] = { - {138, 1}, + {140, 1}, }; static arc arcs_62_1[2] = { - {139, 0}, + {141, 0}, {0, 1}, }; static state states_62[2] = { @@ -1455,22 +1433,23 @@ static state states_62[2] = { {2, arcs_62_1}, }; static arc arcs_63_0[1] = { - {140, 1}, + {142, 1}, }; -static arc arcs_63_1[2] = { - {141, 0}, +static arc arcs_63_1[3] = { + {143, 0}, + {144, 0}, {0, 1}, }; static state states_63[2] = { {1, arcs_63_0}, - {2, arcs_63_1}, + {3, arcs_63_1}, }; static arc arcs_64_0[1] = { - {142, 1}, + {145, 1}, }; static arc arcs_64_1[3] = { - {143, 0}, - {144, 0}, + {146, 0}, + {147, 0}, {0, 1}, }; static state states_64[2] = { @@ -1478,21 +1457,9 @@ static state states_64[2] = { {3, arcs_64_1}, }; static arc arcs_65_0[1] = { - {145, 1}, -}; -static arc arcs_65_1[3] = { - {146, 0}, - {147, 0}, - {0, 1}, -}; -static state states_65[2] = { - {1, arcs_65_0}, - {3, arcs_65_1}, -}; -static arc arcs_66_0[1] = { {148, 1}, }; -static arc arcs_66_1[6] = { +static arc arcs_65_1[6] = { {34, 0}, {11, 0}, {149, 0}, @@ -1500,63 +1467,63 @@ static arc arcs_66_1[6] = { {151, 0}, {0, 1}, }; -static state states_66[2] = { - {1, arcs_66_0}, - {6, arcs_66_1}, +static state states_65[2] = { + {1, arcs_65_0}, + {6, arcs_65_1}, }; -static arc arcs_67_0[4] = { +static arc arcs_66_0[4] = { {146, 1}, {147, 1}, {152, 1}, {153, 2}, }; -static arc arcs_67_1[1] = { +static arc arcs_66_1[1] = { {148, 2}, }; -static arc arcs_67_2[1] = { +static arc arcs_66_2[1] = { {0, 2}, }; -static state states_67[3] = { - {4, arcs_67_0}, - {1, arcs_67_1}, - {1, arcs_67_2}, +static state states_66[3] = { + {4, arcs_66_0}, + {1, arcs_66_1}, + {1, arcs_66_2}, }; -static arc arcs_68_0[1] = { +static arc arcs_67_0[1] = { {154, 1}, }; -static arc arcs_68_1[2] = { +static arc arcs_67_1[2] = { {35, 2}, {0, 1}, }; -static arc arcs_68_2[1] = { +static arc arcs_67_2[1] = { {148, 3}, }; -static arc arcs_68_3[1] = { +static arc arcs_67_3[1] = { {0, 3}, }; -static state states_68[4] = { - {1, arcs_68_0}, - {2, arcs_68_1}, - {1, arcs_68_2}, - {1, arcs_68_3}, +static state states_67[4] = { + {1, arcs_67_0}, + {2, arcs_67_1}, + {1, arcs_67_2}, + {1, arcs_67_3}, }; -static arc arcs_69_0[2] = { +static arc arcs_68_0[2] = { {155, 1}, {156, 2}, }; -static arc arcs_69_1[1] = { +static arc arcs_68_1[1] = { {156, 2}, }; -static arc arcs_69_2[2] = { +static arc arcs_68_2[2] = { {157, 2}, {0, 2}, }; -static state states_69[3] = { - {2, arcs_69_0}, - {1, arcs_69_1}, - {2, arcs_69_2}, +static state states_68[3] = { + {2, arcs_68_0}, + {1, arcs_68_1}, + {2, arcs_68_2}, }; -static arc arcs_70_0[10] = { +static arc arcs_69_0[10] = { {13, 1}, {159, 2}, {161, 3}, @@ -1568,458 +1535,491 @@ static arc arcs_70_0[10] = { {167, 4}, {168, 4}, }; -static arc arcs_70_1[3] = { +static arc arcs_69_1[3] = { {51, 6}, {158, 6}, {15, 4}, }; -static arc arcs_70_2[2] = { +static arc arcs_69_2[2] = { {158, 7}, {160, 4}, }; -static arc arcs_70_3[2] = { +static arc arcs_69_3[2] = { {162, 8}, {163, 4}, }; -static arc arcs_70_4[1] = { +static arc arcs_69_4[1] = { {0, 4}, }; -static arc arcs_70_5[2] = { +static arc arcs_69_5[2] = { {165, 5}, {0, 5}, }; -static arc arcs_70_6[1] = { +static arc arcs_69_6[1] = { {15, 4}, }; -static arc arcs_70_7[1] = { +static arc arcs_69_7[1] = { {160, 4}, }; -static arc arcs_70_8[1] = { +static arc arcs_69_8[1] = { {163, 4}, }; -static state states_70[9] = { - {10, arcs_70_0}, - {3, arcs_70_1}, - {2, arcs_70_2}, - {2, arcs_70_3}, - {1, arcs_70_4}, - {2, arcs_70_5}, - {1, arcs_70_6}, - {1, arcs_70_7}, - {1, arcs_70_8}, -}; -static arc arcs_71_0[2] = { +static state states_69[9] = { + {10, arcs_69_0}, + {3, arcs_69_1}, + {2, arcs_69_2}, + {2, arcs_69_3}, + {1, arcs_69_4}, + {2, arcs_69_5}, + {1, arcs_69_6}, + {1, arcs_69_7}, + {1, arcs_69_8}, +}; +static arc arcs_70_0[2] = { {99, 1}, {52, 1}, }; -static arc arcs_71_1[3] = { +static arc arcs_70_1[3] = { {169, 2}, {33, 3}, {0, 1}, }; -static arc arcs_71_2[1] = { +static arc arcs_70_2[1] = { {0, 2}, }; -static arc arcs_71_3[3] = { +static arc arcs_70_3[3] = { {99, 4}, {52, 4}, {0, 3}, }; -static arc arcs_71_4[2] = { +static arc arcs_70_4[2] = { {33, 3}, {0, 4}, }; -static state states_71[5] = { - {2, arcs_71_0}, - {3, arcs_71_1}, - {1, arcs_71_2}, - {3, arcs_71_3}, - {2, arcs_71_4}, +static state states_70[5] = { + {2, arcs_70_0}, + {3, arcs_70_1}, + {1, arcs_70_2}, + {3, arcs_70_3}, + {2, arcs_70_4}, }; -static arc arcs_72_0[3] = { +static arc arcs_71_0[3] = { {13, 1}, {159, 2}, {83, 3}, }; -static arc arcs_72_1[2] = { +static arc arcs_71_1[2] = { {14, 4}, {15, 5}, }; -static arc arcs_72_2[1] = { +static arc arcs_71_2[1] = { {170, 6}, }; -static arc arcs_72_3[1] = { +static arc arcs_71_3[1] = { {23, 5}, }; -static arc arcs_72_4[1] = { +static arc arcs_71_4[1] = { {15, 5}, }; -static arc arcs_72_5[1] = { +static arc arcs_71_5[1] = { {0, 5}, }; -static arc arcs_72_6[1] = { +static arc arcs_71_6[1] = { {160, 5}, }; -static state states_72[7] = { - {3, arcs_72_0}, - {2, arcs_72_1}, - {1, arcs_72_2}, - {1, arcs_72_3}, - {1, arcs_72_4}, - {1, arcs_72_5}, - {1, arcs_72_6}, +static state states_71[7] = { + {3, arcs_71_0}, + {2, arcs_71_1}, + {1, arcs_71_2}, + {1, arcs_71_3}, + {1, arcs_71_4}, + {1, arcs_71_5}, + {1, arcs_71_6}, }; -static arc arcs_73_0[1] = { +static arc arcs_72_0[1] = { {171, 1}, }; -static arc arcs_73_1[2] = { +static arc arcs_72_1[2] = { {33, 2}, {0, 1}, }; -static arc arcs_73_2[2] = { +static arc arcs_72_2[2] = { {171, 1}, {0, 2}, }; -static state states_73[3] = { - {1, arcs_73_0}, - {2, arcs_73_1}, - {2, arcs_73_2}, +static state states_72[3] = { + {1, arcs_72_0}, + {2, arcs_72_1}, + {2, arcs_72_2}, }; -static arc arcs_74_0[2] = { +static arc arcs_73_0[2] = { {26, 1}, {27, 2}, }; -static arc arcs_74_1[2] = { +static arc arcs_73_1[2] = { {27, 2}, {0, 1}, }; -static arc arcs_74_2[3] = { +static arc arcs_73_2[3] = { {26, 3}, {172, 4}, {0, 2}, }; -static arc arcs_74_3[2] = { +static arc arcs_73_3[2] = { {172, 4}, {0, 3}, }; -static arc arcs_74_4[1] = { +static arc arcs_73_4[1] = { {0, 4}, }; -static state states_74[5] = { - {2, arcs_74_0}, - {2, arcs_74_1}, - {3, arcs_74_2}, - {2, arcs_74_3}, - {1, arcs_74_4}, +static state states_73[5] = { + {2, arcs_73_0}, + {2, arcs_73_1}, + {3, arcs_73_2}, + {2, arcs_73_3}, + {1, arcs_73_4}, }; -static arc arcs_75_0[1] = { +static arc arcs_74_0[1] = { {27, 1}, }; -static arc arcs_75_1[2] = { +static arc arcs_74_1[2] = { {26, 2}, {0, 1}, }; -static arc arcs_75_2[1] = { +static arc arcs_74_2[1] = { {0, 2}, }; -static state states_75[3] = { - {1, arcs_75_0}, - {2, arcs_75_1}, - {1, arcs_75_2}, +static state states_74[3] = { + {1, arcs_74_0}, + {2, arcs_74_1}, + {1, arcs_74_2}, }; -static arc arcs_76_0[2] = { +static arc arcs_75_0[2] = { {111, 1}, {52, 1}, }; -static arc arcs_76_1[2] = { +static arc arcs_75_1[2] = { {33, 2}, {0, 1}, }; -static arc arcs_76_2[3] = { +static arc arcs_75_2[3] = { {111, 1}, {52, 1}, {0, 2}, }; -static state states_76[3] = { - {2, arcs_76_0}, - {2, arcs_76_1}, - {3, arcs_76_2}, +static state states_75[3] = { + {2, arcs_75_0}, + {2, arcs_75_1}, + {3, arcs_75_2}, }; -static arc arcs_77_0[1] = { +static arc arcs_76_0[1] = { {26, 1}, }; -static arc arcs_77_1[2] = { +static arc arcs_76_1[2] = { {33, 2}, {0, 1}, }; -static arc arcs_77_2[2] = { +static arc arcs_76_2[2] = { {26, 1}, {0, 2}, }; -static state states_77[3] = { - {1, arcs_77_0}, - {2, arcs_77_1}, - {2, arcs_77_2}, +static state states_76[3] = { + {1, arcs_76_0}, + {2, arcs_76_1}, + {2, arcs_76_2}, }; -static arc arcs_78_0[3] = { +static arc arcs_77_0[3] = { {26, 1}, {35, 2}, {52, 3}, }; -static arc arcs_78_1[4] = { +static arc arcs_77_1[4] = { {27, 4}, {169, 5}, {33, 6}, {0, 1}, }; -static arc arcs_78_2[1] = { +static arc arcs_77_2[1] = { {111, 7}, }; -static arc arcs_78_3[3] = { +static arc arcs_77_3[3] = { {169, 5}, {33, 6}, {0, 3}, }; -static arc arcs_78_4[1] = { +static arc arcs_77_4[1] = { {26, 7}, }; -static arc arcs_78_5[1] = { +static arc arcs_77_5[1] = { {0, 5}, }; -static arc arcs_78_6[3] = { +static arc arcs_77_6[3] = { {26, 8}, {52, 8}, {0, 6}, }; -static arc arcs_78_7[3] = { +static arc arcs_77_7[3] = { {169, 5}, {33, 9}, {0, 7}, }; -static arc arcs_78_8[2] = { +static arc arcs_77_8[2] = { {33, 6}, {0, 8}, }; -static arc arcs_78_9[3] = { +static arc arcs_77_9[3] = { {26, 10}, {35, 11}, {0, 9}, }; -static arc arcs_78_10[1] = { +static arc arcs_77_10[1] = { {27, 12}, }; -static arc arcs_78_11[1] = { +static arc arcs_77_11[1] = { {111, 13}, }; -static arc arcs_78_12[1] = { +static arc arcs_77_12[1] = { {26, 13}, }; -static arc arcs_78_13[2] = { +static arc arcs_77_13[2] = { {33, 9}, {0, 13}, }; -static state states_78[14] = { - {3, arcs_78_0}, - {4, arcs_78_1}, - {1, arcs_78_2}, - {3, arcs_78_3}, - {1, arcs_78_4}, - {1, arcs_78_5}, - {3, arcs_78_6}, - {3, arcs_78_7}, - {2, arcs_78_8}, - {3, arcs_78_9}, - {1, arcs_78_10}, - {1, arcs_78_11}, - {1, arcs_78_12}, - {2, arcs_78_13}, -}; -static arc arcs_79_0[1] = { +static state states_77[14] = { + {3, arcs_77_0}, + {4, arcs_77_1}, + {1, arcs_77_2}, + {3, arcs_77_3}, + {1, arcs_77_4}, + {1, arcs_77_5}, + {3, arcs_77_6}, + {3, arcs_77_7}, + {2, arcs_77_8}, + {3, arcs_77_9}, + {1, arcs_77_10}, + {1, arcs_77_11}, + {1, arcs_77_12}, + {2, arcs_77_13}, +}; +static arc arcs_78_0[1] = { {173, 1}, }; -static arc arcs_79_1[1] = { +static arc arcs_78_1[1] = { {23, 2}, }; -static arc arcs_79_2[2] = { +static arc arcs_78_2[2] = { {13, 3}, {27, 4}, }; -static arc arcs_79_3[2] = { +static arc arcs_78_3[2] = { {14, 5}, {15, 6}, }; -static arc arcs_79_4[1] = { +static arc arcs_78_4[1] = { {100, 7}, }; -static arc arcs_79_5[1] = { +static arc arcs_78_5[1] = { {15, 6}, }; -static arc arcs_79_6[1] = { +static arc arcs_78_6[1] = { {27, 4}, }; -static arc arcs_79_7[1] = { +static arc arcs_78_7[1] = { {0, 7}, }; -static state states_79[8] = { - {1, arcs_79_0}, - {1, arcs_79_1}, - {2, arcs_79_2}, - {2, arcs_79_3}, - {1, arcs_79_4}, - {1, arcs_79_5}, - {1, arcs_79_6}, - {1, arcs_79_7}, +static state states_78[8] = { + {1, arcs_78_0}, + {1, arcs_78_1}, + {2, arcs_78_2}, + {2, arcs_78_3}, + {1, arcs_78_4}, + {1, arcs_78_5}, + {1, arcs_78_6}, + {1, arcs_78_7}, }; -static arc arcs_80_0[1] = { +static arc arcs_79_0[1] = { {174, 1}, }; -static arc arcs_80_1[2] = { +static arc arcs_79_1[2] = { {33, 2}, {0, 1}, }; -static arc arcs_80_2[2] = { +static arc arcs_79_2[2] = { {174, 1}, {0, 2}, }; -static state states_80[3] = { - {1, arcs_80_0}, - {2, arcs_80_1}, - {2, arcs_80_2}, +static state states_79[3] = { + {1, arcs_79_0}, + {2, arcs_79_1}, + {2, arcs_79_2}, }; -static arc arcs_81_0[3] = { +static arc arcs_80_0[3] = { {26, 1}, {35, 2}, {34, 2}, }; -static arc arcs_81_1[4] = { +static arc arcs_80_1[4] = { {169, 3}, {115, 2}, {32, 2}, {0, 1}, }; -static arc arcs_81_2[1] = { +static arc arcs_80_2[1] = { {26, 3}, }; -static arc arcs_81_3[1] = { +static arc arcs_80_3[1] = { {0, 3}, }; -static state states_81[4] = { - {3, arcs_81_0}, - {4, arcs_81_1}, - {1, arcs_81_2}, - {1, arcs_81_3}, +static state states_80[4] = { + {3, arcs_80_0}, + {4, arcs_80_1}, + {1, arcs_80_2}, + {1, arcs_80_3}, }; -static arc arcs_82_0[2] = { +static arc arcs_81_0[2] = { {169, 1}, {176, 1}, }; -static arc arcs_82_1[1] = { +static arc arcs_81_1[1] = { {0, 1}, }; -static state states_82[2] = { - {2, arcs_82_0}, - {1, arcs_82_1}, +static state states_81[2] = { + {2, arcs_81_0}, + {1, arcs_81_1}, }; -static arc arcs_83_0[1] = { +static arc arcs_82_0[1] = { {104, 1}, }; -static arc arcs_83_1[1] = { +static arc arcs_82_1[1] = { {67, 2}, }; -static arc arcs_83_2[1] = { +static arc arcs_82_2[1] = { {105, 3}, }; -static arc arcs_83_3[1] = { +static arc arcs_82_3[1] = { {116, 4}, }; -static arc arcs_83_4[2] = { +static arc arcs_82_4[2] = { {175, 5}, {0, 4}, }; -static arc arcs_83_5[1] = { +static arc arcs_82_5[1] = { {0, 5}, }; -static state states_83[6] = { - {1, arcs_83_0}, - {1, arcs_83_1}, - {1, arcs_83_2}, - {1, arcs_83_3}, - {2, arcs_83_4}, - {1, arcs_83_5}, +static state states_82[6] = { + {1, arcs_82_0}, + {1, arcs_82_1}, + {1, arcs_82_2}, + {1, arcs_82_3}, + {2, arcs_82_4}, + {1, arcs_82_5}, }; -static arc arcs_84_0[2] = { +static arc arcs_83_0[2] = { {21, 1}, {177, 2}, }; -static arc arcs_84_1[1] = { +static arc arcs_83_1[1] = { {177, 2}, }; -static arc arcs_84_2[1] = { +static arc arcs_83_2[1] = { {0, 2}, }; -static state states_84[3] = { - {2, arcs_84_0}, - {1, arcs_84_1}, - {1, arcs_84_2}, +static state states_83[3] = { + {2, arcs_83_0}, + {1, arcs_83_1}, + {1, arcs_83_2}, }; -static arc arcs_85_0[1] = { +static arc arcs_84_0[1] = { {98, 1}, }; -static arc arcs_85_1[1] = { +static arc arcs_84_1[1] = { {118, 2}, }; -static arc arcs_85_2[2] = { +static arc arcs_84_2[2] = { {175, 3}, {0, 2}, }; -static arc arcs_85_3[1] = { +static arc arcs_84_3[1] = { {0, 3}, }; -static state states_85[4] = { - {1, arcs_85_0}, - {1, arcs_85_1}, - {2, arcs_85_2}, - {1, arcs_85_3}, +static state states_84[4] = { + {1, arcs_84_0}, + {1, arcs_84_1}, + {2, arcs_84_2}, + {1, arcs_84_3}, }; -static arc arcs_86_0[1] = { +static arc arcs_85_0[1] = { {23, 1}, }; -static arc arcs_86_1[1] = { +static arc arcs_85_1[1] = { {0, 1}, }; -static state states_86[2] = { - {1, arcs_86_0}, - {1, arcs_86_1}, +static state states_85[2] = { + {1, arcs_85_0}, + {1, arcs_85_1}, }; -static arc arcs_87_0[1] = { +static arc arcs_86_0[1] = { {179, 1}, }; -static arc arcs_87_1[2] = { +static arc arcs_86_1[2] = { {180, 2}, {0, 1}, }; +static arc arcs_86_2[1] = { + {0, 2}, +}; +static state states_86[3] = { + {1, arcs_86_0}, + {2, arcs_86_1}, + {1, arcs_86_2}, +}; +static arc arcs_87_0[2] = { + {78, 1}, + {48, 2}, +}; +static arc arcs_87_1[1] = { + {26, 2}, +}; static arc arcs_87_2[1] = { {0, 2}, }; static state states_87[3] = { - {1, arcs_87_0}, - {2, arcs_87_1}, + {2, arcs_87_0}, + {1, arcs_87_1}, {1, arcs_87_2}, }; static arc arcs_88_0[2] = { - {78, 1}, - {48, 2}, + {3, 1}, + {2, 2}, }; static arc arcs_88_1[1] = { - {26, 2}, + {0, 1}, }; -static arc arcs_88_2[1] = { - {0, 2}, +static arc arcs_88_2[2] = { + {28, 3}, + {113, 4}, +}; +static arc arcs_88_3[1] = { + {2, 5}, +}; +static arc arcs_88_4[1] = { + {6, 6}, +}; +static arc arcs_88_5[1] = { + {113, 4}, +}; +static arc arcs_88_6[2] = { + {6, 6}, + {114, 1}, }; -static state states_88[3] = { +static state states_88[7] = { {2, arcs_88_0}, {1, arcs_88_1}, - {1, arcs_88_2}, + {2, arcs_88_2}, + {1, arcs_88_3}, + {1, arcs_88_4}, + {1, arcs_88_5}, + {2, arcs_88_6}, }; static arc arcs_89_0[1] = { {182, 1}, @@ -2220,88 +2220,88 @@ static dfa dfas[92] = { "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, {303, "except_clause", 0, 5, states_47, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000"}, - {304, "func_body_suite", 0, 7, states_48, + {304, "suite", 0, 5, states_48, "\004\040\200\000\004\000\000\000\024\174\022\016\000\000\000\041\000\000\014\211\362\001\010"}, - {305, "suite", 0, 5, states_49, - "\004\040\200\000\004\000\000\000\024\174\022\016\000\000\000\041\000\000\014\211\362\001\010"}, - {306, "namedexpr_test", 0, 4, states_50, + {305, "namedexpr_test", 0, 4, states_49, "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, - {307, "test", 0, 6, states_51, + {306, "test", 0, 6, states_50, "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, - {308, "test_nocond", 0, 2, states_52, + {307, "test_nocond", 0, 2, states_51, "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, - {309, "lambdef", 0, 5, states_53, + {308, "lambdef", 0, 5, states_52, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000"}, - {310, "lambdef_nocond", 0, 5, states_54, + {309, "lambdef_nocond", 0, 5, states_53, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000"}, - {311, "or_test", 0, 2, states_55, + {310, "or_test", 0, 2, states_54, "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\040\000\000\014\211\362\001\000"}, - {312, "and_test", 0, 2, states_56, + {311, "and_test", 0, 2, states_55, "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\040\000\000\014\211\362\001\000"}, - {313, "not_test", 0, 3, states_57, + {312, "not_test", 0, 3, states_56, "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\040\000\000\014\211\362\001\000"}, - {314, "comparison", 0, 2, states_58, + {313, "comparison", 0, 2, states_57, "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\014\211\362\001\000"}, - {315, "comp_op", 0, 4, states_59, + {314, "comp_op", 0, 4, states_58, "\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\040\377\000\000\000\000\000\000"}, - {316, "star_expr", 0, 3, states_60, + {315, "star_expr", 0, 3, states_59, "\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {317, "expr", 0, 2, states_61, + {316, "expr", 0, 2, states_60, "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\014\211\362\001\000"}, - {318, "xor_expr", 0, 2, states_62, + {317, "xor_expr", 0, 2, states_61, "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\014\211\362\001\000"}, - {319, "and_expr", 0, 2, states_63, + {318, "and_expr", 0, 2, states_62, "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\014\211\362\001\000"}, - {320, "shift_expr", 0, 2, states_64, + {319, "shift_expr", 0, 2, states_63, "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\014\211\362\001\000"}, - {321, "arith_expr", 0, 2, states_65, + {320, "arith_expr", 0, 2, states_64, "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\014\211\362\001\000"}, - {322, "term", 0, 2, states_66, + {321, "term", 0, 2, states_65, "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\014\211\362\001\000"}, - {323, "factor", 0, 3, states_67, + {322, "factor", 0, 3, states_66, "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\014\211\362\001\000"}, - {324, "power", 0, 4, states_68, + {323, "power", 0, 4, states_67, "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\210\362\001\000"}, - {325, "atom_expr", 0, 3, states_69, + {324, "atom_expr", 0, 3, states_68, "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\210\362\001\000"}, - {326, "atom", 0, 9, states_70, + {325, "atom", 0, 9, states_69, "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\200\362\001\000"}, - {327, "testlist_comp", 0, 5, states_71, + {326, "testlist_comp", 0, 5, states_70, "\000\040\200\000\004\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, - {328, "trailer", 0, 7, states_72, + {327, "trailer", 0, 7, states_71, "\000\040\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\200\000\000\000"}, - {329, "subscriptlist", 0, 3, states_73, + {328, "subscriptlist", 0, 3, states_72, "\000\040\200\010\000\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, - {330, "subscript", 0, 5, states_74, + {329, "subscript", 0, 5, states_73, "\000\040\200\010\000\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, - {331, "sliceop", 0, 3, states_75, + {330, "sliceop", 0, 3, states_74, "\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {332, "exprlist", 0, 3, states_76, + {331, "exprlist", 0, 3, states_75, "\000\040\200\000\004\000\000\000\000\000\020\000\000\000\000\000\000\000\014\211\362\001\000"}, - {333, "testlist", 0, 3, states_77, + {332, "testlist", 0, 3, states_76, "\000\040\200\000\000\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, - {334, "dictorsetmaker", 0, 14, states_78, + {333, "dictorsetmaker", 0, 14, states_77, "\000\040\200\000\014\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, - {335, "classdef", 0, 8, states_79, + {334, "classdef", 0, 8, states_78, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\040\000"}, - {336, "arglist", 0, 3, states_80, + {335, "arglist", 0, 3, states_79, "\000\040\200\000\014\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, - {337, "argument", 0, 4, states_81, + {336, "argument", 0, 4, states_80, "\000\040\200\000\014\000\000\000\000\000\020\000\000\000\000\041\000\000\014\211\362\001\000"}, - {338, "comp_iter", 0, 2, states_82, + {337, "comp_iter", 0, 2, states_81, "\000\000\040\000\000\000\000\000\000\000\000\000\004\001\000\000\000\000\000\000\000\000\000"}, - {339, "sync_comp_for", 0, 6, states_83, + {338, "sync_comp_for", 0, 6, states_82, "\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000"}, - {340, "comp_for", 0, 3, states_84, + {339, "comp_for", 0, 3, states_83, "\000\000\040\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000"}, - {341, "comp_if", 0, 4, states_85, + {340, "comp_if", 0, 4, states_84, "\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000"}, - {342, "encoding_decl", 0, 2, states_86, + {341, "encoding_decl", 0, 2, states_85, "\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {343, "yield_expr", 0, 3, states_87, + {342, "yield_expr", 0, 3, states_86, "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\010"}, - {344, "yield_arg", 0, 3, states_88, + {343, "yield_arg", 0, 3, states_87, "\000\040\200\000\004\000\000\000\000\100\020\000\000\000\000\041\000\000\014\211\362\001\000"}, + {344, "func_body_suite", 0, 7, states_88, + "\004\040\200\000\004\000\000\000\024\174\022\016\000\000\000\041\000\000\014\211\362\001\010"}, {345, "func_type_input", 0, 3, states_89, "\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {346, "func_type", 0, 6, states_90, @@ -2319,16 +2319,16 @@ static label labels[184] = { {269, 0}, {0, 0}, {258, 0}, - {333, 0}, + {332, 0}, {259, 0}, {49, 0}, {291, 0}, {7, 0}, - {336, 0}, + {335, 0}, {8, 0}, {260, 0}, {261, 0}, - {335, 0}, + {334, 0}, {263, 0}, {262, 0}, {1, "async"}, @@ -2336,10 +2336,10 @@ static label labels[184] = { {1, 0}, {264, 0}, {51, 0}, - {307, 0}, + {306, 0}, {11, 0}, {56, 0}, - {304, 0}, + {344, 0}, {265, 0}, {266, 0}, {22, 0}, @@ -2361,8 +2361,8 @@ static label labels[184] = { {274, 0}, {273, 0}, {275, 0}, - {343, 0}, - {316, 0}, + {342, 0}, + {315, 0}, {36, 0}, {37, 0}, {38, 0}, @@ -2377,7 +2377,7 @@ static label labels[184] = { {46, 0}, {48, 0}, {1, "del"}, - {332, 0}, + {331, 0}, {1, "pass"}, {279, 0}, {280, 0}, @@ -2409,8 +2409,8 @@ static label labels[184] = { {301, 0}, {296, 0}, {1, "if"}, - {306, 0}, {305, 0}, + {304, 0}, {1, "elif"}, {1, "else"}, {1, "while"}, @@ -2421,23 +2421,23 @@ static label labels[184] = { {1, "finally"}, {1, "with"}, {302, 0}, - {317, 0}, + {316, 0}, {1, "except"}, {5, 0}, {6, 0}, {53, 0}, - {311, 0}, - {309, 0}, - {308, 0}, {310, 0}, + {308, 0}, + {307, 0}, + {309, 0}, {1, "lambda"}, - {312, 0}, + {311, 0}, {1, "or"}, - {313, 0}, + {312, 0}, {1, "and"}, {1, "not"}, + {313, 0}, {314, 0}, - {315, 0}, {20, 0}, {21, 0}, {27, 0}, @@ -2446,51 +2446,51 @@ static label labels[184] = { {28, 0}, {28, 0}, {1, "is"}, - {318, 0}, + {317, 0}, {18, 0}, - {319, 0}, + {318, 0}, {32, 0}, - {320, 0}, + {319, 0}, {19, 0}, - {321, 0}, + {320, 0}, {33, 0}, {34, 0}, - {322, 0}, + {321, 0}, {14, 0}, {15, 0}, - {323, 0}, + {322, 0}, {17, 0}, {24, 0}, {47, 0}, {31, 0}, + {323, 0}, {324, 0}, - {325, 0}, {1, "await"}, - {326, 0}, - {328, 0}, + {325, 0}, {327, 0}, + {326, 0}, {9, 0}, {10, 0}, {25, 0}, - {334, 0}, + {333, 0}, {26, 0}, {2, 0}, {3, 0}, {1, "None"}, {1, "True"}, {1, "False"}, - {340, 0}, + {339, 0}, + {328, 0}, {329, 0}, {330, 0}, - {331, 0}, {1, "class"}, + {336, 0}, {337, 0}, + {340, 0}, {338, 0}, {341, 0}, - {339, 0}, - {342, 0}, {1, "yield"}, - {344, 0}, + {343, 0}, {345, 0}, {346, 0}, {347, 0}, From 110c42afdc4116bb2b28c0225482f37e74c7a023 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 25 Jan 2019 12:14:55 -0800 Subject: [PATCH 24/46] Fix test_parser.py in a hacky way This counteracts a previous commit labeled "A better hack for IndentationError". --- Modules/parsermodule.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c index eabc5c810f6ce6..87f58d340c2dbe 100644 --- a/Modules/parsermodule.c +++ b/Modules/parsermodule.c @@ -663,6 +663,12 @@ validate_node(node *tree) for (pos = 0; pos < nch; ++pos) { node *ch = CHILD(tree, pos); int ch_type = TYPE(ch); + if (ch_type == suite && TYPE(tree) == funcdef) { + /* This is the opposite hack of what we do in parser.c + (search for func_body_suite), except we don't ever + support type comments here. */ + ch_type = func_body_suite; + } for (arc = 0; arc < dfa_state->s_narcs; ++arc) { short a_label = dfa_state->s_arc[arc].a_lbl; assert(a_label < _PyParser_Grammar.g_ll.ll_nlabels); From 46dfac5b3385684e23e24a8a70cca1a28ab7739c Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 25 Jan 2019 12:48:31 -0800 Subject: [PATCH 25/46] Export PyCF_TYPE_COMMENTS and add an interface for it to ast.parse() --- Lib/ast.py | 8 ++++++-- Parser/asdl_c.py | 2 ++ Python/Python-ast.c | 2 ++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Lib/ast.py b/Lib/ast.py index 6c1e978b058667..470a74b3b5ff79 100644 --- a/Lib/ast.py +++ b/Lib/ast.py @@ -27,12 +27,16 @@ from _ast import * -def parse(source, filename='', mode='exec'): +def parse(source, filename='', mode='exec', *, type_comments=False): """ Parse the source into an AST node. Equivalent to compile(source, filename, mode, PyCF_ONLY_AST). + Pass type_comments=True to get back type comments where the syntax allows. """ - return compile(source, filename, mode, PyCF_ONLY_AST) + flags = PyCF_ONLY_AST + if type_comments: + flags |= PyCF_TYPE_COMMENTS + return compile(source, filename, mode, flags) def literal_eval(node_or_string): diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 6c538b751d2f00..1526995e3f8b55 100644 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -1002,6 +1002,8 @@ def visitModule(self, mod): self.emit('if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return NULL;', 1) self.emit('if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0)', 1) self.emit("return NULL;", 2) + self.emit('if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0)', 1) + self.emit("return NULL;", 2) for dfn in mod.dfns: self.visit(dfn) self.emit("return m;", 1) diff --git a/Python/Python-ast.c b/Python/Python-ast.c index 854ccdd1237862..5467d192ee69c0 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -8710,6 +8710,8 @@ PyInit__ast(void) if (PyDict_SetItemString(d, "AST", (PyObject*)&AST_type) < 0) return NULL; if (PyModule_AddIntMacro(m, PyCF_ONLY_AST) < 0) return NULL; + if (PyModule_AddIntMacro(m, PyCF_TYPE_COMMENTS) < 0) + return NULL; if (PyDict_SetItemString(d, "mod", (PyObject*)mod_type) < 0) return NULL; if (PyDict_SetItemString(d, "Module", (PyObject*)Module_type) < 0) return NULL; From 8c527b71e6e7bd3a7b046b4ae56bbe1e880170db Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Fri, 25 Jan 2019 12:59:39 -0800 Subject: [PATCH 26/46] Add some tests for type comments --- Lib/test/test_type_comments.py | 203 +++++++++++++++++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 Lib/test/test_type_comments.py diff --git a/Lib/test/test_type_comments.py b/Lib/test/test_type_comments.py new file mode 100644 index 00000000000000..d1b032097e5551 --- /dev/null +++ b/Lib/test/test_type_comments.py @@ -0,0 +1,203 @@ +import ast +import unittest + + +funcdef = """\ +def foo(): + # type: () -> int + pass + +def bar(): # type: () -> None + pass +""" + +asyncdef = """\ +async def foo(): + # type: () -> int + return await bar() + +async def bar(): # type: () -> int + return await bar() +""" + +forstmt = """\ +for a in []: # type: int + pass +""" + + +withstmt = """\ +with context(): # type: int + pass +""" + +vardecl = """\ +a = 0 # type: int +a # type: int +""" + +ignores = """\ +def foo(): + pass # type: ignore + +def bar(): + x = 1 # type: ignore +""" + +# Test for long-form type-comments in arguments. A test function +# named 'fabvk' would have two positional args, a and b, plus a +# var-arg *v, plus a kw-arg **k. It is verified in test_longargs() +# that it has exactly these arguments, no more, no fewer. +longargs = """\ +def fa( + a = 1, # type: A +): + pass + +def fa( + a = 1 # type: A +): + pass + +def fab( + a, # type: A + b, # type: B +): + pass + +def fab( + a, # type: A + b # type: B +): + pass + +def fv( + *v, # type: V +): + pass + +def fv( + *v # type: V +): + pass + +def fk( + **k, # type: K +): + pass + +def fk( + **k # type: K +): + pass + +def fvk( + *v, # type: V + **k, # type: K +): + pass + +def fvk( + *v, # type: V + **k # type: K +): + pass + +def fav( + a, # type: A + *v, # type: V +): + pass + +def fav( + a, # type: A + *v # type: V +): + pass + +def fak( + a, # type: A + **k, # type: K +): + pass + +def fak( + a, # type: A + **k # type: K +): + pass + +def favk( + a, # type: A + *v, # type: V + **k, # type: K +): + pass + +def favk( + a, # type: A + *v, # type: V + **k # type: K +): + pass +""" + + +class TypeCommentTests(unittest.TestCase): + + def parse(self, source): + return ast.parse(source, type_comments=True) + + def test_funcdef(self): + tree = self.parse(funcdef) + self.assertEqual(tree.body[0].type_comment, "() -> int") + self.assertEqual(tree.body[1].type_comment, "() -> None") + + def test_asyncdef(self): + tree = self.parse(asyncdef) + self.assertEqual(tree.body[0].type_comment, "() -> int") + self.assertEqual(tree.body[1].type_comment, "() -> int") + + def test_forstmt(self): + tree = self.parse(forstmt) + self.assertEqual(tree.body[0].type_comment, "int") + + def test_withstmt(self): + tree = self.parse(withstmt) + self.assertEqual(tree.body[0].type_comment, "int") + + def test_vardecl(self): + tree = self.parse(vardecl) + self.assertEqual(tree.body[0].type_comment, "int") + # Curious fact: an expression can have a type comment but it + # is lost in the AST, so we have this in the example source + # code but don't test it here. + + def test_ignores(self): + tree = self.parse(ignores) + self.assertEqual([ti.lineno for ti in tree.type_ignores], [2, 5]) + + def test_longargs(self): + tree = self.parse(longargs) + for t in tree.body: + # The expected args are encoded in the function name + todo = set(t.name[1:]) + self.assertEqual(len(t.args.args), + len(todo) - bool(t.args.vararg) - bool(t.args.kwarg)) + self.assertTrue(t.name.startswith('f'), t.name) + for c in t.name[1:]: + todo.remove(c) + if c == 'v': + arg = t.args.vararg + elif c == 'k': + arg = t.args.kwarg + else: + assert 0 <= ord(c) - ord('a') < len(t.args.args) + arg = t.args.args[ord(c) - ord('a')] + self.assertEqual(arg.arg, c) # That's the argument name + self.assertEqual(arg.type_comment, arg.arg.upper()) + assert not todo + + +if __name__ == '__main__': + unittest.main() From cb301f7fcbfbbe160a60b9839b3df218dab44c98 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Sun, 27 Jan 2019 17:16:47 -0800 Subject: [PATCH 27/46] Add some negative tests --- Lib/test/test_type_comments.py | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Lib/test/test_type_comments.py b/Lib/test/test_type_comments.py index d1b032097e5551..a50f976fed0781 100644 --- a/Lib/test/test_type_comments.py +++ b/Lib/test/test_type_comments.py @@ -198,6 +198,27 @@ def test_longargs(self): self.assertEqual(arg.type_comment, arg.arg.upper()) assert not todo + def test_inappropriate_type_comments(self): + """Tests for inappropriately-placed type comments. + + These should be silently ignored with type comments off, + but raise SyntaxError with type comments on. + + This is not meant to be exhaustive. + """ + + def check_both_ways(source): + ast.parse(source, type_comments=False) + with self.assertRaises(SyntaxError): + ast.parse(source, type_comments=True) + + check_both_ways("pass # type: int\n") + check_both_ways("x += 1 # type: int\n") + check_both_ways("while True: # type: int\n continue\n") + check_both_ways("while True:\n continue # type: int\n") + check_both_ways("try: # type: int\n pass\nfinally:\n pass\n") + check_both_ways("try:\n pass\nfinally: # type: int\n pass\n") + if __name__ == '__main__': unittest.main() From d57aeabfaa4dd3be8f3c30f00c4fbfdcc407a8bd Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Sun, 27 Jan 2019 17:28:09 -0800 Subject: [PATCH 28/46] Add checks that no type comments are returned without type_comments=True --- Lib/test/test_type_comments.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Lib/test/test_type_comments.py b/Lib/test/test_type_comments.py index a50f976fed0781..ac5b5de59e322a 100644 --- a/Lib/test/test_type_comments.py +++ b/Lib/test/test_type_comments.py @@ -148,23 +148,36 @@ class TypeCommentTests(unittest.TestCase): def parse(self, source): return ast.parse(source, type_comments=True) + def classic_parse(self, source): + return ast.parse(source) + def test_funcdef(self): tree = self.parse(funcdef) self.assertEqual(tree.body[0].type_comment, "() -> int") self.assertEqual(tree.body[1].type_comment, "() -> None") + tree = self.classic_parse(funcdef) + self.assertEqual(tree.body[0].type_comment, None) + self.assertEqual(tree.body[1].type_comment, None) def test_asyncdef(self): tree = self.parse(asyncdef) self.assertEqual(tree.body[0].type_comment, "() -> int") self.assertEqual(tree.body[1].type_comment, "() -> int") + tree = self.classic_parse(asyncdef) + self.assertEqual(tree.body[0].type_comment, None) + self.assertEqual(tree.body[1].type_comment, None) def test_forstmt(self): tree = self.parse(forstmt) self.assertEqual(tree.body[0].type_comment, "int") + tree = self.classic_parse(forstmt) + self.assertEqual(tree.body[0].type_comment, None) def test_withstmt(self): tree = self.parse(withstmt) self.assertEqual(tree.body[0].type_comment, "int") + tree = self.classic_parse(withstmt) + self.assertEqual(tree.body[0].type_comment, None) def test_vardecl(self): tree = self.parse(vardecl) @@ -172,10 +185,14 @@ def test_vardecl(self): # Curious fact: an expression can have a type comment but it # is lost in the AST, so we have this in the example source # code but don't test it here. + tree = self.classic_parse(vardecl) + self.assertEqual(tree.body[0].type_comment, None) def test_ignores(self): tree = self.parse(ignores) self.assertEqual([ti.lineno for ti in tree.type_ignores], [2, 5]) + tree = self.classic_parse(ignores) + self.assertEqual(tree.type_ignores, []) def test_longargs(self): tree = self.parse(longargs) @@ -197,6 +214,12 @@ def test_longargs(self): self.assertEqual(arg.arg, c) # That's the argument name self.assertEqual(arg.type_comment, arg.arg.upper()) assert not todo + tree = self.classic_parse(longargs) + for t in tree.body: + for arg in t.args.args + [t.args.vararg, t.args.kwarg]: + if arg is not None: + self.assertIsNone(arg.type_comment, "%s(%s:%r)" % + (t.name, arg.arg, arg.type_comment)) def test_inappropriate_type_comments(self): """Tests for inappropriately-placed type comments. From 30ea39e67c96571bc7d8ad4e355dc67aa15fb3d4 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Sun, 27 Jan 2019 17:29:42 -0800 Subject: [PATCH 29/46] Add 'as a' to with-statement with type comment --- Lib/test/test_type_comments.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_type_comments.py b/Lib/test/test_type_comments.py index ac5b5de59e322a..9b393a274d3398 100644 --- a/Lib/test/test_type_comments.py +++ b/Lib/test/test_type_comments.py @@ -27,7 +27,7 @@ async def bar(): # type: () -> int withstmt = """\ -with context(): # type: int +with context() as a: # type: int pass """ From cef9f31a99793e806e4ca2a764c52d0e1652773d Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Sun, 27 Jan 2019 17:45:13 -0800 Subject: [PATCH 30/46] Don't allow type comments on expression statements Includes tests. Also tweak a comment in Grammar/Grammar. --- Grammar/Grammar | 5 ++--- Lib/test/test_type_comments.py | 5 +---- Python/graminit.c | 5 ++--- 3 files changed, 5 insertions(+), 10 deletions(-) diff --git a/Grammar/Grammar b/Grammar/Grammar index 7f736711ee016f..e125b72cdfc63e 100644 --- a/Grammar/Grammar +++ b/Grammar/Grammar @@ -9,8 +9,7 @@ # eval_input is the input for the eval() functions. # func_type_input is a PEP 484 Python 2 function type comment # NB: compound_stmt in single_input is followed by extra NEWLINE! -# NB: due to the way TYPE_COMMENT is tokenized it will always be followed by a -# NEWLINE +# NB: due to the way TYPE_COMMENT is tokenized it will always be followed by a NEWLINE single_input: NEWLINE | simple_stmt | compound_stmt NEWLINE file_input: (NEWLINE | stmt)* ENDMARKER eval_input: testlist NEWLINE* ENDMARKER @@ -42,7 +41,7 @@ simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE small_stmt: (expr_stmt | del_stmt | pass_stmt | flow_stmt | import_stmt | global_stmt | nonlocal_stmt | assert_stmt) expr_stmt: testlist_star_expr (annassign | augassign (yield_expr|testlist) | - ('=' (yield_expr|testlist_star_expr))* [TYPE_COMMENT]) + [('=' (yield_expr|testlist_star_expr))+ [TYPE_COMMENT]] ) annassign: ':' test ['=' (yield_expr|testlist)] testlist_star_expr: (test|star_expr) (',' (test|star_expr))* [','] augassign: ('+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' | diff --git a/Lib/test/test_type_comments.py b/Lib/test/test_type_comments.py index 9b393a274d3398..5ed60c35a2f5f5 100644 --- a/Lib/test/test_type_comments.py +++ b/Lib/test/test_type_comments.py @@ -33,7 +33,6 @@ async def bar(): # type: () -> int vardecl = """\ a = 0 # type: int -a # type: int """ ignores = """\ @@ -182,9 +181,6 @@ def test_withstmt(self): def test_vardecl(self): tree = self.parse(vardecl) self.assertEqual(tree.body[0].type_comment, "int") - # Curious fact: an expression can have a type comment but it - # is lost in the AST, so we have this in the example source - # code but don't test it here. tree = self.classic_parse(vardecl) self.assertEqual(tree.body[0].type_comment, None) @@ -236,6 +232,7 @@ def check_both_ways(source): ast.parse(source, type_comments=True) check_both_ways("pass # type: int\n") + check_both_ways("foo() # type: int\n") check_both_ways("x += 1 # type: int\n") check_both_ways("while True: # type: int\n continue\n") check_both_ways("while True:\n continue # type: int\n") diff --git a/Python/graminit.c b/Python/graminit.c index 516eca85b1a50f..6e0f19891baa01 100644 --- a/Python/graminit.c +++ b/Python/graminit.c @@ -501,11 +501,10 @@ static state states_15[2] = { static arc arcs_16_0[1] = { {48, 1}, }; -static arc arcs_16_1[5] = { +static arc arcs_16_1[4] = { {49, 2}, {50, 3}, {32, 4}, - {28, 2}, {0, 1}, }; static arc arcs_16_2[1] = { @@ -526,7 +525,7 @@ static arc arcs_16_5[3] = { }; static state states_16[6] = { {1, arcs_16_0}, - {5, arcs_16_1}, + {4, arcs_16_1}, {1, arcs_16_2}, {2, arcs_16_3}, {2, arcs_16_4}, From 1667b8c40557fa2e47fbd78dacae709383d83aa6 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 28 Jan 2019 08:34:32 -0800 Subject: [PATCH 31/46] Add guards to some '== TYPE_COMMENT' checks, hopefully fixing a crash --- Python/ast.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Python/ast.c b/Python/ast.c index e18b20ea003e1c..0da33f7a9c0d00 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -1538,7 +1538,7 @@ ast_for_arguments(struct compiling *c, const node *n) return NULL; asdl_seq_SET(posargs, k++, arg); i += 1; /* the name */ - if (TYPE(CHILD(n, i)) == COMMA) + if (i < NCH(n) && TYPE(CHILD(n, i)) == COMMA) i += 1; /* the comma, if present */ break; case STAR: @@ -1554,7 +1554,7 @@ ast_for_arguments(struct compiling *c, const node *n) int res = 0; i += 2; /* now follows keyword only arguments */ - if (TYPE(CHILD(n, i)) == TYPE_COMMENT) { + if (i < NCH(n) && TYPE(CHILD(n, i)) == TYPE_COMMENT) { ast_error(c, CHILD(n, i), "bare * has associated type comment"); return NULL; @@ -1571,10 +1571,10 @@ ast_for_arguments(struct compiling *c, const node *n) return NULL; i += 2; /* the star and the name */ - if (TYPE(CHILD(n, i)) == COMMA) + if (i < NCH(n) && TYPE(CHILD(n, i)) == COMMA) i += 1; /* the comma, if present */ - if (TYPE(CHILD(n, i)) == TYPE_COMMENT) { + if (i < NCH(n) && TYPE(CHILD(n, i)) == TYPE_COMMENT) { vararg->type_comment = NEW_TYPE_COMMENT(CHILD(n, i)); i += 1; } From 895a0129f1937637a5a0128cc5352d9c096ab3d9 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 28 Jan 2019 08:57:56 -0800 Subject: [PATCH 32/46] Support compile(source, filename, 'func_type', PyCF_ONLY_AST) --- Include/compile.h | 4 ++-- Lib/test/test_type_comments.py | 19 +++++++++++++++++++ Python/Python-ast.c | 5 +++-- Python/bltinmodule.c | 18 +++++++++++++++--- 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/Include/compile.h b/Include/compile.h index 36477c01e2ba63..d0bbed8f558b15 100644 --- a/Include/compile.h +++ b/Include/compile.h @@ -86,10 +86,10 @@ PyAPI_FUNC(int) _PyAST_Optimize(struct _mod *, PyArena *arena, int optimize); #endif /* !Py_LIMITED_API */ -/* These definitions must match corresponding definitions in graminit.h. - There's code in compile.c that checks that they are the same. */ +/* These definitions must match corresponding definitions in graminit.h. */ #define Py_single_input 256 #define Py_file_input 257 #define Py_eval_input 258 +#define Py_func_type_input 345 #endif /* !Py_COMPILE_H */ diff --git a/Lib/test/test_type_comments.py b/Lib/test/test_type_comments.py index 5ed60c35a2f5f5..e2cc88d701e964 100644 --- a/Lib/test/test_type_comments.py +++ b/Lib/test/test_type_comments.py @@ -239,6 +239,25 @@ def check_both_ways(source): check_both_ways("try: # type: int\n pass\nfinally:\n pass\n") check_both_ways("try:\n pass\nfinally: # type: int\n pass\n") + def test_func_type_input(self): + return + + def parse_func_type_input(source): + from ast import PyCF_ONLY_AST + return compile(source, "", "func_type", PyCF_ONLY_AST) + + # Some checks below will crash if the return structure is wrong + tree = parse_func_type_input("() -> int") + self.assertEqual(tree.argtypes, []) + self.assertEqual(tree.returns.id, "int") + + tree = parse_func_type_input("(int) -> List[str]") + self.assertEqual(len(tree.argtypes), 1) + arg = tree.argtypes[0] + self.assertEqual(arg.value.int, "int") + self.assertEqual(tree.returns.value.id, "List") + self.assertEqual(tree.returns.slice.vale.id, "str") + if __name__ == '__main__': unittest.main() diff --git a/Python/Python-ast.c b/Python/Python-ast.c index 5467d192ee69c0..1a56e90bca09aa 100644 --- a/Python/Python-ast.c +++ b/Python/Python-ast.c @@ -8917,18 +8917,19 @@ PyObject* PyAST_mod2obj(mod_ty t) } /* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */ +/* and 3 for "func_type" */ mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode) { mod_ty res; PyObject *req_type[3]; - char *req_name[] = {"Module", "Expression", "Interactive"}; + char *req_name[] = {"Module", "Expression", "Interactive", "FunctionType"}; int isinstance; req_type[0] = (PyObject*)Module_type; req_type[1] = (PyObject*)Expression_type; req_type[2] = (PyObject*)Interactive_type; - assert(0 <= mode && mode <= 2); + assert(0 <= mode && mode <= 3); if (!init_types()) return NULL; diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 930adb496e14cd..f9b901f7e59fb9 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -765,7 +765,7 @@ builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename, int compile_mode = -1; int is_ast; PyCompilerFlags cf; - int start[] = {Py_file_input, Py_eval_input, Py_single_input}; + int start[] = {Py_file_input, Py_eval_input, Py_single_input, Py_func_type_input}; PyObject *result; cf.cf_flags = flags | PyCF_SOURCE_IS_UTF8; @@ -795,9 +795,21 @@ builtin_compile_impl(PyObject *module, PyObject *source, PyObject *filename, compile_mode = 1; else if (strcmp(mode, "single") == 0) compile_mode = 2; + else if (strcmp(mode, "func_type") == 0) { + if (!(flags & PyCF_ONLY_AST)) { + PyErr_SetString(PyExc_ValueError, + "compile() mode 'func_type' requires flag PyCF_ONLY_AST"); + goto error; + } + compile_mode = 3; + } else { - PyErr_SetString(PyExc_ValueError, - "compile() mode must be 'exec', 'eval' or 'single'"); + const char *msg; + if (flags & PyCF_ONLY_AST) + msg = "compile() mode must be 'exec', 'eval', 'single' or 'func_type'"; + else + msg = "compile() mode must be 'exec', 'eval' or 'single'"; + PyErr_SetString(PyExc_ValueError, msg); goto error; } From ac485cdf196cc6023036dd0a21a1a2bfd00d43cc Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 28 Jan 2019 09:31:37 -0800 Subject: [PATCH 33/46] Fix test_func_type_input() --- Lib/test/test_type_comments.py | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/Lib/test/test_type_comments.py b/Lib/test/test_type_comments.py index e2cc88d701e964..fc55c6845e7010 100644 --- a/Lib/test/test_type_comments.py +++ b/Lib/test/test_type_comments.py @@ -240,13 +240,11 @@ def check_both_ways(source): check_both_ways("try:\n pass\nfinally: # type: int\n pass\n") def test_func_type_input(self): - return def parse_func_type_input(source): - from ast import PyCF_ONLY_AST - return compile(source, "", "func_type", PyCF_ONLY_AST) + return ast.parse(source, "", "func_type") - # Some checks below will crash if the return structure is wrong + # Some checks below will crash if the returned structure is wrong tree = parse_func_type_input("() -> int") self.assertEqual(tree.argtypes, []) self.assertEqual(tree.returns.id, "int") @@ -254,9 +252,24 @@ def parse_func_type_input(source): tree = parse_func_type_input("(int) -> List[str]") self.assertEqual(len(tree.argtypes), 1) arg = tree.argtypes[0] - self.assertEqual(arg.value.int, "int") + self.assertEqual(arg.id, "int") self.assertEqual(tree.returns.value.id, "List") - self.assertEqual(tree.returns.slice.vale.id, "str") + self.assertEqual(tree.returns.slice.value.id, "str") + + tree = parse_func_type_input("(int, *str, **Any) -> float") + self.assertEqual(tree.argtypes[0].id, "int") + self.assertEqual(tree.argtypes[1].id, "str") + self.assertEqual(tree.argtypes[2].id, "Any") + self.assertEqual(tree.returns.id, "float") + + with self.assertRaises(SyntaxError): + tree = parse_func_type_input("(int, *str, *Any) -> float") + + with self.assertRaises(SyntaxError): + tree = parse_func_type_input("(int, **str, Any) -> float") + + with self.assertRaises(SyntaxError): + tree = parse_func_type_input("(**int, **str) -> float") if __name__ == '__main__': From 89350057968225617016c569281fa58573e4c50c Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 28 Jan 2019 09:47:36 -0800 Subject: [PATCH 34/46] Document type_comments=True and mode='func_type' for ast.parse() --- Doc/library/ast.rst | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index 7715a28ce1b873..359b627c1dc59f 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -126,16 +126,33 @@ The abstract grammar is currently defined as follows: Apart from the node classes, the :mod:`ast` module defines these utility functions and classes for traversing abstract syntax trees: -.. function:: parse(source, filename='', mode='exec') +.. function:: parse(source, filename='', mode='exec', *, type_comments=False) Parse the source into an AST node. Equivalent to ``compile(source, filename, mode, ast.PyCF_ONLY_AST)``. + If ``type_comments=True`` is given, the parser is modified to check + and return type comments as specified by :pep:`484` and :pep:526`. + This is equivalent to adding :data:`ast.PyCF_TYPE_COMMENTS` to the + flags passed to :func:`compile()`. This will report syntax errors + for misplaced type comments. Without this flag, type comments will + be ignored, and the ``type_comment`` field on selected AST nodes + will always be ``None``. In addition, the locations of ``# type: + ignore`` comments will be returned as the ``type_ignores`` + attribute of :class:`Module` (otherwise it is always an empty list). + + In addition, if ``mode`` is ``'func_type'``, the input syntax is + modified to correspond to :pep:`484` "signature type comments", + e.g. ``(str, int) -> List[str]``. + .. warning:: It is possible to crash the Python interpreter with a sufficiently large/complex string due to stack depth limitations in Python's AST compiler. + .. versionchanged:: 3.8 + Added ``type_comments=True`` and ``mode='func_type'``. + .. function:: literal_eval(node_or_string) From 4687be4662193d5f1c69156a463ea02b9854c1c8 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 28 Jan 2019 09:54:14 -0800 Subject: [PATCH 35/46] Document token.TYPE_COMMENT --- Doc/library/token.rst | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Doc/library/token.rst b/Doc/library/token.rst index 5358eb5a291e63..4936e9aa08f43d 100644 --- a/Doc/library/token.rst +++ b/Doc/library/token.rst @@ -69,6 +69,13 @@ the :mod:`tokenize` module. always be an ``ENCODING`` token. +.. data:: TYPE_COMMENT + + Token value indicating that a type comment was recognized. Such + tokens are only produced when :func:`ast.parse()` is invoked with + ``type_comments=True``. + + .. versionchanged:: 3.5 Added :data:`AWAIT` and :data:`ASYNC` tokens. @@ -78,3 +85,6 @@ the :mod:`tokenize` module. .. versionchanged:: 3.7 Removed :data:`AWAIT` and :data:`ASYNC` tokens. "async" and "await" are now tokenized as :data:`NAME` tokens. + +.. versionchanged:: 3.8 + Added :data:`TYPE_COMMENT`. From 783224d6a0ca58972842c321ca871490a973bb42 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 28 Jan 2019 11:10:29 -0800 Subject: [PATCH 36/46] Fix the asdl_c.py code generator to support mode='func_type' --- Parser/asdl_c.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Parser/asdl_c.py b/Parser/asdl_c.py index 1526995e3f8b55..a51a5db739044a 100644 --- a/Parser/asdl_c.py +++ b/Parser/asdl_c.py @@ -1187,18 +1187,19 @@ class PartingShots(StaticVisitor): } /* mode is 0 for "exec", 1 for "eval" and 2 for "single" input */ +/* and 3 for "func_type" */ mod_ty PyAST_obj2mod(PyObject* ast, PyArena* arena, int mode) { mod_ty res; PyObject *req_type[3]; - char *req_name[] = {"Module", "Expression", "Interactive"}; + char *req_name[] = {"Module", "Expression", "Interactive", "FunctionType"}; int isinstance; req_type[0] = (PyObject*)Module_type; req_type[1] = (PyObject*)Expression_type; req_type[2] = (PyObject*)Interactive_type; - assert(0 <= mode && mode <= 2); + assert(0 <= mode && mode <= 3); if (!init_types()) return NULL; From 50a921a0575356ee0d93caaf4a0b118cb316ac63 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 28 Jan 2019 11:23:21 -0800 Subject: [PATCH 37/46] Reject function def with two signature type comments Example: def foo(): # type: () -> int # type: () -> str pass --- Lib/test/test_type_comments.py | 11 ++++++++++- Python/ast.c | 12 ++++++++---- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Lib/test/test_type_comments.py b/Lib/test/test_type_comments.py index fc55c6845e7010..6e766361669a4b 100644 --- a/Lib/test/test_type_comments.py +++ b/Lib/test/test_type_comments.py @@ -20,12 +20,17 @@ async def bar(): # type: () -> int return await bar() """ +redundantdef = """\ +def foo(): # type: () -> int + # type: () -> str + return '' +""" + forstmt = """\ for a in []: # type: int pass """ - withstmt = """\ with context() as a: # type: int pass @@ -166,6 +171,10 @@ def test_asyncdef(self): self.assertEqual(tree.body[0].type_comment, None) self.assertEqual(tree.body[1].type_comment, None) + def test_redundantdef(self): + with self.assertRaisesRegex(SyntaxError, "^Cannot have two type comments on def"): + tree = self.parse(redundantdef) + def test_forstmt(self): tree = self.parse(forstmt) self.assertEqual(tree.body[0].type_comment, "int") diff --git a/Python/ast.c b/Python/ast.c index 0da33f7a9c0d00..4d59344a4aa48c 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -1752,13 +1752,17 @@ ast_for_funcdef_impl(struct compiling *c, const node *n0, return NULL; get_last_end_pos(body, &end_lineno, &end_col_offset); - if (!type_comment && NCH(CHILD(n, name_i + 3)) > 1) { - /* If the function doesn't have a type comment on the same line, check - * if the suite has a type comment in it. */ + if (NCH(CHILD(n, name_i + 3)) > 1) { + /* Check if the suite has a type comment in it. */ tc = CHILD(CHILD(n, name_i + 3), 1); - if (TYPE(tc) == TYPE_COMMENT) + if (TYPE(tc) == TYPE_COMMENT) { + if (type_comment != NULL) { + ast_error(c, n, "Cannot have two type comments on def"); + return NULL; + } type_comment = NEW_TYPE_COMMENT(tc); + } } if (is_async) From d0adc22d37b11879163706846f28ea65ee8314b6 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 28 Jan 2019 11:28:34 -0800 Subject: [PATCH 38/46] Add a test with a non-ASCII name in a type comment --- Lib/test/test_type_comments.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Lib/test/test_type_comments.py b/Lib/test/test_type_comments.py index 6e766361669a4b..3065ddca2d9ab2 100644 --- a/Lib/test/test_type_comments.py +++ b/Lib/test/test_type_comments.py @@ -26,6 +26,12 @@ def foo(): # type: () -> int return '' """ +nonasciidef = """\ +def foo(): + # type: () -> àçčéñt + pass +""" + forstmt = """\ for a in []: # type: int pass @@ -175,6 +181,10 @@ def test_redundantdef(self): with self.assertRaisesRegex(SyntaxError, "^Cannot have two type comments on def"): tree = self.parse(redundantdef) + def test_nonasciidef(self): + tree = self.parse(nonasciidef) + self.assertEqual(tree.body[0].type_comment, "() -> àçčéñt") + def test_forstmt(self): tree = self.parse(forstmt) self.assertEqual(tree.body[0].type_comment, "int") From 98ee20a1775fb80dda11c6a69c033415a054b367 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 28 Jan 2019 11:31:34 -0800 Subject: [PATCH 39/46] Add comment clarifying the func_body_suite switcheroo --- Parser/parser.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Parser/parser.c b/Parser/parser.c index b082afca27b624..fa4a8f011ff525 100644 --- a/Parser/parser.c +++ b/Parser/parser.c @@ -263,6 +263,9 @@ PyParser_AddToken(parser_state *ps, int type, char *str, int arrow = x & ((1<<7)-1); dfa *d1; if (nt == func_body_suite && !(ps->p_flags & PyCF_TYPE_COMMENTS)) { + /* When parsing type comments is not requested, + we can provide better errors about bad indentation + by using 'suite' for the body of a funcdef */ D(printf(" [switch func_body_suite to suite]")); nt = suite; } From 4abedd3f9f46309ca9ff51189548daefc2e37e66 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 28 Jan 2019 11:33:28 -0800 Subject: [PATCH 40/46] Check for errors from _Py_asdl_seq_new() --- Python/ast.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Python/ast.c b/Python/ast.c index 4d59344a4aa48c..cad82d1d582777 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -894,6 +894,8 @@ PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags, } argtypes = _Py_asdl_seq_new(num, arena); + if (!argtypes) + goto out; j = 0; for (i = 0; i < NCH(ch); i++) { @@ -905,8 +907,11 @@ PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags, } } } - else + else { argtypes = _Py_asdl_seq_new(0, arena); + if (!argtypes) + goto out; + } ret = ast_for_expr(&c, CHILD(n, NCH(n) - 1)); if (!ret) From 551f2a645d9f954558cb389964effc6e7984932f Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 28 Jan 2019 11:40:34 -0800 Subject: [PATCH 41/46] Check for NULL from NEW_TYPE_COMMENT() Also: - remove redundant 'c' argument from new_type_comment() - double-check that TYPE_COMMENT in a suite is followed by NL --- Python/ast.c | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/Python/ast.c b/Python/ast.c index cad82d1d582777..2d3bfc80305769 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -699,11 +699,11 @@ ast_error(struct compiling *c, const node *n, const char *errmsg, ...) */ static string -new_type_comment(const char *s, struct compiling *c) +new_type_comment(const char *s) { return PyUnicode_DecodeUTF8(s, strlen(s), NULL); } -#define NEW_TYPE_COMMENT(n) new_type_comment(STR(n), c) +#define NEW_TYPE_COMMENT(n) new_type_comment(STR(n)) static int num_stmts(const node *n) @@ -1412,6 +1412,8 @@ handle_keywordonly_args(struct compiling *c, const node *n, int start, case TYPE_COMMENT: /* arg will be equal to the last argument processed */ arg->type_comment = NEW_TYPE_COMMENT(ch); + if (!arg->type_comment) + goto error; i += 1; break; case DOUBLESTAR: @@ -1581,6 +1583,8 @@ ast_for_arguments(struct compiling *c, const node *n) if (i < NCH(n) && TYPE(CHILD(n, i)) == TYPE_COMMENT) { vararg->type_comment = NEW_TYPE_COMMENT(CHILD(n, i)); + if (!vararg->type_comment) + return NULL; i += 1; } @@ -1612,6 +1616,8 @@ ast_for_arguments(struct compiling *c, const node *n) /* arg will be equal to the last argument processed */ arg->type_comment = NEW_TYPE_COMMENT(ch); + if (!arg->type_comment) + return NULL; i += 1; break; default: @@ -1750,6 +1756,8 @@ ast_for_funcdef_impl(struct compiling *c, const node *n0, } if (TYPE(CHILD(n, name_i + 3)) == TYPE_COMMENT) { type_comment = NEW_TYPE_COMMENT(CHILD(n, name_i + 3)); + if (!type_comment) + return NULL; name_i += 1; } body = ast_for_suite(c, CHILD(n, name_i + 3)); @@ -1767,6 +1775,8 @@ ast_for_funcdef_impl(struct compiling *c, const node *n0, return NULL; } type_comment = NEW_TYPE_COMMENT(tc); + if (!type_comment) + return NULL; } } @@ -3345,8 +3355,11 @@ ast_for_expr_stmt(struct compiling *c, const node *n) expression = ast_for_expr(c, value); if (!expression) return NULL; - if (has_type_comment) + if (has_type_comment) { type_comment = NEW_TYPE_COMMENT(CHILD(n, nch_minus_type)); + if (!type_comment) + return NULL; + } else type_comment = NULL; return Assign(targets, expression, type_comment, LINENO(n), n->n_col_offset, @@ -3809,8 +3822,10 @@ ast_for_suite(struct compiling *c, const node *n) } else { i = 2; - if (TYPE(CHILD(n, 1)) == TYPE_COMMENT) + if (TYPE(CHILD(n, 1)) == TYPE_COMMENT) { i += 2; + REQ(CHILD(n, 2), NEWLINE); + } for (; i < (NCH(n) - 1); i++) { ch = CHILD(n, i); @@ -4086,8 +4101,11 @@ ast_for_for_stmt(struct compiling *c, const node *n0, bool is_async) get_last_end_pos(suite_seq, &end_lineno, &end_col_offset); } - if (has_type_comment) + if (has_type_comment) { type_comment = NEW_TYPE_COMMENT(CHILD(n, 5)); + if (!type_comment) + return NULL; + } else type_comment = NULL; @@ -4294,8 +4312,11 @@ ast_for_with_stmt(struct compiling *c, const node *n0, bool is_async) return NULL; get_last_end_pos(body, &end_lineno, &end_col_offset); - if (has_type_comment) + if (has_type_comment) { type_comment = NEW_TYPE_COMMENT(CHILD(n, NCH(n) - 2)); + if (!type_comment) + return NULL; + } else type_comment = NULL; From b68270ce090f6ccb44308e4f77f02c7819c5177d Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Mon, 28 Jan 2019 12:05:05 -0800 Subject: [PATCH 42/46] Fix markup bug --- Doc/library/ast.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Doc/library/ast.rst b/Doc/library/ast.rst index 359b627c1dc59f..3df7f9ebc70cc7 100644 --- a/Doc/library/ast.rst +++ b/Doc/library/ast.rst @@ -132,7 +132,7 @@ and classes for traversing abstract syntax trees: filename, mode, ast.PyCF_ONLY_AST)``. If ``type_comments=True`` is given, the parser is modified to check - and return type comments as specified by :pep:`484` and :pep:526`. + and return type comments as specified by :pep:`484` and :pep:`526`. This is equivalent to adding :data:`ast.PyCF_TYPE_COMMENTS` to the flags passed to :func:`compile()`. This will report syntax errors for misplaced type comments. Without this flag, type comments will From dcf86e88a7ca4a8b40a0223da0f6b6e41d68a2f2 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Wed, 30 Jan 2019 08:23:52 -0800 Subject: [PATCH 43/46] Brace block in parsetok.c --- Parser/parsetok.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Parser/parsetok.c b/Parser/parsetok.c index 6fcf91570176fb..7fddc5a0e8975e 100644 --- a/Parser/parsetok.c +++ b/Parser/parsetok.c @@ -36,8 +36,9 @@ growable_int_array_add(growable_int_array *arr, int item) { if (arr->num_items >= arr->size) { arr->size *= 2; arr->items = realloc(arr->items, arr->size * sizeof(*arr->items)); - if (!arr->items) + if (!arr->items) { return 0; + } } arr->items[arr->num_items] = item; From 87812ad3cea4708b7949f0d0edb5e2d8d9626531 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Wed, 30 Jan 2019 08:26:12 -0800 Subject: [PATCH 44/46] Brace a block and fix indentation of another block --- Parser/tokenizer.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index d9d7f999466ab8..1ded9ade377156 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -1263,8 +1263,9 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) prefix = type_comment_prefix; while (*prefix && p < tok->cur) { if (*prefix == ' ') { - while (*p == ' ' || *p == '\t') + while (*p == ' ' || *p == '\t') { p++; + } } else if (*prefix == *p) { p++; } else { @@ -1284,10 +1285,10 @@ tok_get(struct tok_state *tok, char **p_start, char **p_end) is_type_ignore = tok->cur >= p + 6 && memcmp(p, "ignore", 6) == 0; p += 6; while (is_type_ignore && p < tok->cur) { - if (*p == '#') - break; - is_type_ignore = is_type_ignore && (*p == ' ' || *p == '\t'); - p++; + if (*p == '#') + break; + is_type_ignore = is_type_ignore && (*p == ' ' || *p == '\t'); + p++; } if (is_type_ignore) { From 5633403cab51ec2b417b83b2c5ac094ec68de7fa Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Wed, 30 Jan 2019 08:26:43 -0800 Subject: [PATCH 45/46] Brace block, update grammar comment, fix indents of many ast_error calls --- Python/ast.c | 61 ++++++++++++++++++++++++++++------------------------ 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/Python/ast.c b/Python/ast.c index 2d3bfc80305769..c422e9651ced46 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -889,8 +889,9 @@ PyAST_FromNodeObject(const node *n, PyCompilerFlags *flags, * stars on the args -- just parse them into an ordered list */ num = 0; for (i = 0; i < NCH(ch); i++) { - if (TYPE(CHILD(ch, i)) == test) + if (TYPE(CHILD(ch, i)) == test) { num++; + } } argtypes = _Py_asdl_seq_new(num, arena); @@ -1553,7 +1554,7 @@ ast_for_arguments(struct compiling *c, const node *n) (i+2 == NCH(n) && (TYPE(CHILD(n, i+1)) == COMMA || TYPE(CHILD(n, i+1)) == TYPE_COMMENT))) { ast_error(c, CHILD(n, i), - "named arguments must follow bare *"); + "named arguments must follow bare *"); return NULL; } ch = CHILD(n, i+1); /* tfpdef or COMMA */ @@ -1563,7 +1564,7 @@ ast_for_arguments(struct compiling *c, const node *n) if (i < NCH(n) && TYPE(CHILD(n, i)) == TYPE_COMMENT) { ast_error(c, CHILD(n, i), - "bare * has associated type comment"); + "bare * has associated type comment"); return NULL; } @@ -2432,7 +2433,7 @@ ast_for_atom(struct compiling *c, const node *n) /* It's a dictionary comprehension. */ if (is_dict) { ast_error(c, n, "dict unpacking cannot be used in " - "dict comprehension"); + "dict comprehension"); return NULL; } res = ast_for_dictcomp(c, ch); @@ -3007,13 +3008,13 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func, if (nkeywords) { if (ndoublestars) { ast_error(c, chch, - "positional argument follows " - "keyword argument unpacking"); + "positional argument follows " + "keyword argument unpacking"); } else { ast_error(c, chch, - "positional argument follows " - "keyword argument"); + "positional argument follows " + "keyword argument"); } return NULL; } @@ -3027,8 +3028,8 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func, expr_ty starred; if (ndoublestars) { ast_error(c, chch, - "iterable argument unpacking follows " - "keyword argument unpacking"); + "iterable argument unpacking follows " + "keyword argument unpacking"); return NULL; } e = ast_for_expr(c, CHILD(ch, 1)); @@ -3066,13 +3067,13 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func, if (nkeywords) { if (ndoublestars) { ast_error(c, chch, - "positional argument follows " - "keyword argument unpacking"); + "positional argument follows " + "keyword argument unpacking"); } else { ast_error(c, chch, - "positional argument follows " - "keyword argument"); + "positional argument follows " + "keyword argument"); } return NULL; } @@ -3133,7 +3134,7 @@ ast_for_call(struct compiling *c, const node *n, expr_ty func, tmp = ((keyword_ty)asdl_seq_GET(keywords, k))->arg; if (tmp && !PyUnicode_Compare(tmp, key)) { ast_error(c, chch, - "keyword argument repeated"); + "keyword argument repeated"); return NULL; } } @@ -3182,16 +3183,16 @@ ast_for_expr_stmt(struct compiling *c, const node *n) { REQ(n, expr_stmt); /* expr_stmt: testlist_star_expr (annassign | augassign (yield_expr|testlist) | - ('=' (yield_expr|testlist_star_expr))* [TYPE_COMMENT]) - annassign: ':' test ['=' test] - testlist_star_expr: (test|star_expr) (',' test|star_expr)* [','] - augassign: '+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' - | '<<=' | '>>=' | '**=' | '//=' + [('=' (yield_expr|testlist_star_expr))+ [TYPE_COMMENT]] ) + annassign: ':' test ['=' (yield_expr|testlist)] + testlist_star_expr: (test|star_expr) (',' (test|star_expr))* [','] + augassign: ('+=' | '-=' | '*=' | '@=' | '/=' | '%=' | '&=' | '|=' | '^=' | + '<<=' | '>>=' | '**=' | '//=') test: ... here starts the operator precedence dance */ int num = NCH(n); - if (num == 1 || (num == 2 && TYPE(CHILD(n, 1)) == TYPE_COMMENT)) { + if (num == 1) { expr_ty e = ast_for_testlist(c, CHILD(n, 0)); if (!e) return NULL; @@ -3670,8 +3671,9 @@ ast_for_import_stmt(struct compiling *c, const node *n) n = CHILD(n, idx); n_children = NCH(n); if (n_children % 2 == 0) { - ast_error(c, n, "trailing comma not allowed without" - " surrounding parentheses"); + ast_error(c, n, + "trailing comma not allowed without" + " surrounding parentheses"); return NULL; } break; @@ -4951,8 +4953,9 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, if (ch == '\\') { /* Error: can't include a backslash character, inside parens or strings or not. */ - ast_error(c, n, "f-string expression part " - "cannot include a backslash"); + ast_error(c, n, + "f-string expression part " + "cannot include a backslash"); return -1; } if (quote_char) { @@ -5076,8 +5079,9 @@ fstring_find_expr(const char **str, const char *end, int raw, int recurse_lvl, /* Validate the conversion. */ if (!(conversion == 's' || conversion == 'r' || conversion == 'a')) { - ast_error(c, n, "f-string: invalid conversion character: " - "expected 's', 'r', or 'a'"); + ast_error(c, n, + "f-string: invalid conversion character: " + "expected 's', 'r', or 'a'"); return -1; } } @@ -5629,7 +5633,8 @@ parsestr(struct compiling *c, const node *n, int *bytesmode, int *rawmode, const char *ch; for (ch = s; *ch; ch++) { if (Py_CHARMASK(*ch) >= 0x80) { - ast_error(c, n, "bytes can only contain ASCII " + ast_error(c, n, + "bytes can only contain ASCII " "literal characters."); return -1; } From 229874c612df868e7ae3e997e159915f49d16542 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Wed, 30 Jan 2019 15:49:12 -0800 Subject: [PATCH 46/46] Break up long comment to trigger Appveyor build --- Grammar/Grammar | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Grammar/Grammar b/Grammar/Grammar index e125b72cdfc63e..e65a688e4cd8f2 100644 --- a/Grammar/Grammar +++ b/Grammar/Grammar @@ -153,7 +153,8 @@ encoding_decl: NAME yield_expr: 'yield' [yield_arg] yield_arg: 'from' test | testlist_star_expr -# the TYPE_COMMENT in suites is only parsed for funcdefs, but can't go elsewhere due to ambiguity +# the TYPE_COMMENT in suites is only parsed for funcdefs, +# but can't go elsewhere due to ambiguity func_body_suite: simple_stmt | NEWLINE [TYPE_COMMENT NEWLINE] INDENT stmt+ DEDENT func_type_input: func_type NEWLINE* ENDMARKER