Nick Coghlan avatar Nick Coghlan committed 08b56f9

Working proof of concept for implicit call syntax

Comments (0)

Files changed (12)

 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 (augassign (yield_expr|testlist) |
-                     ('=' (yield_expr|testlist_star_expr))*)
+
+expr_stmt: testlist_star_expr [(augassign_stmt_trailer |
+                                assign_stmt_trailer |
+                                implicit_arglist)]
 testlist_star_expr: (test|star_expr) (',' (test|star_expr))* [',']
+augassign_stmt_trailer: augassign (yield_expr|testlist)
 augassign: ('+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' |
             '<<=' | '>>=' | '**=' | '//=')
-# For normal assignments, additional restrictions enforced by the interpreter
+# For normal assignments, additional LHS restrictions enforced by compiler
+assign_stmt_trailer: ('=' (yield_expr|testlist_star_expr))+
+# Implicit arglists are currently identical to normal ones
+# May want to change that to require parens on generator expressions
+implicit_arglist: arglist
+
 del_stmt: 'del' exprlist
 pass_stmt: 'pass'
 flow_stmt: break_stmt | continue_stmt | return_stmt | raise_stmt | yield_stmt
        '{' [dictorsetmaker] '}' |
        NAME | NUMBER | STRING+ | '...' | 'None' | 'True' | 'False')
 testlist_comp: (test|star_expr) ( comp_for | (',' (test|star_expr))* [','] )
-trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
+trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME | '{' '}'
 subscriptlist: subscript (',' subscript)* [',']
 subscript: test | [test] ':' [test] [sliceop]
 sliceop: ':' [test]

Include/graminit.h

 #define small_stmt 270
 #define expr_stmt 271
 #define testlist_star_expr 272
-#define augassign 273
-#define del_stmt 274
-#define pass_stmt 275
-#define flow_stmt 276
-#define break_stmt 277
-#define continue_stmt 278
-#define return_stmt 279
-#define yield_stmt 280
-#define raise_stmt 281
-#define import_stmt 282
-#define import_name 283
-#define import_from 284
-#define import_as_name 285
-#define dotted_as_name 286
-#define import_as_names 287
-#define dotted_as_names 288
-#define dotted_name 289
-#define global_stmt 290
-#define nonlocal_stmt 291
-#define assert_stmt 292
-#define compound_stmt 293
-#define if_stmt 294
-#define while_stmt 295
-#define for_stmt 296
-#define try_stmt 297
-#define with_stmt 298
-#define with_item 299
-#define except_clause 300
-#define suite 301
-#define test 302
-#define test_nocond 303
-#define lambdef 304
-#define lambdef_nocond 305
-#define or_test 306
-#define and_test 307
-#define not_test 308
-#define comparison 309
-#define comp_op 310
-#define star_expr 311
-#define expr 312
-#define xor_expr 313
-#define and_expr 314
-#define shift_expr 315
-#define arith_expr 316
-#define term 317
-#define factor 318
-#define power 319
-#define atom 320
-#define testlist_comp 321
-#define trailer 322
-#define subscriptlist 323
-#define subscript 324
-#define sliceop 325
-#define exprlist 326
-#define testlist 327
-#define dictorsetmaker 328
-#define classdef 329
-#define arglist 330
-#define argument 331
-#define comp_iter 332
-#define comp_for 333
-#define comp_if 334
-#define encoding_decl 335
-#define yield_expr 336
-#define yield_arg 337
+#define augassign_stmt_trailer 273
+#define augassign 274
+#define assign_stmt_trailer 275
+#define implicit_arglist 276
+#define del_stmt 277
+#define pass_stmt 278
+#define flow_stmt 279
+#define break_stmt 280
+#define continue_stmt 281
+#define return_stmt 282
+#define yield_stmt 283
+#define raise_stmt 284
+#define import_stmt 285
+#define import_name 286
+#define import_from 287
+#define import_as_name 288
+#define dotted_as_name 289
+#define import_as_names 290
+#define dotted_as_names 291
+#define dotted_name 292
+#define global_stmt 293
+#define nonlocal_stmt 294
+#define assert_stmt 295
+#define compound_stmt 296
+#define if_stmt 297
+#define while_stmt 298
+#define for_stmt 299
+#define try_stmt 300
+#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 323
+#define testlist_comp 324
+#define trailer 325
+#define subscriptlist 326
+#define subscript 327
+#define sliceop 328
+#define exprlist 329
+#define testlist 330
+#define dictorsetmaker 331
+#define classdef 332
+#define arglist 333
+#define argument 334
+#define comp_iter 335
+#define comp_for 336
+#define comp_if 337
+#define encoding_decl 338
+#define yield_expr 339
+#define yield_arg 340

Lib/test/test_ast.py

                                     (single_tests, single_results, "single"),
                                     (eval_tests, eval_results, "eval")):
             for i, o in zip(input, output):
-                ast_tree = compile(i, "?", kind, ast.PyCF_ONLY_AST)
-                self.assertEqual(to_tuple(ast_tree), o)
-                self._assertTrueorder(ast_tree, (0, 0))
+                with self.subTest(input=i, output=o, kind=kind):
+                    ast_tree = compile(i, "?", kind, ast.PyCF_ONLY_AST)
+                    self.assertEqual(to_tuple(ast_tree), o)
+                    self._assertTrueorder(ast_tree, (0, 0))
 
     def test_slice(self):
         slc = ast.parse("x[::]").body[0].value.slice

Lib/test/test_codeop.py

         av("def f():\n pass\n#foo\n")
         av("@a.b.c\ndef f():\n pass\n")
 
+        av("a b")
+
     def test_incomplete(self):
         ai = self.assertIncomplete
 
 
     def test_invalid(self):
         ai = self.assertInvalid
-        ai("a b")
 
         ai("a @")
         ai("a b @")

Lib/test/test_future.py

         else:
             self.fail("expected exception didn't occur")
 
-    def test_parserhack(self):
+    def test_parserhack_disabled(self):
         # test that the parser.c::future_hack function works as expected
-        # Note: although this test must pass, it's not testing the original
-        #       bug as of 2.6 since the with statement is not optional and
-        #       the parser hack disabled. If a new keyword is introduced in
-        #       2.6, change this to refer to the new future import.
+        # When there are no valid future imports, we check that it is
+        # *disabled*
+        # When there is a valid future import defined, modify this to
+        # check that it is *enabled* instead
+        # Note: We use the PEP 401 April Fool's joke to check this, since
+        #       that will never become default behaviour. I bet Brett
+        #       never expected *that* to find a valid use case!
         try:
-            exec("from __future__ import print_function; print 0")
+            exec("from __future__ import barry_as_FLUFL; 1 <> 2")
         except SyntaxError:
             pass
         else:
             self.fail("syntax error didn't occur")
 
         try:
-            exec("from __future__ import (print_function); print 0")
+            exec("from __future__ import (barry_as_FLUFL); 1 <> 2")
         except SyntaxError:
             pass
         else:

Lib/test/test_grammar.py

         check_syntax_error(self, "x + 1 = 1")
         check_syntax_error(self, "a + 1 = b + 2")
 
+    def test_implicit_calls(self):
+        def f(*args, **kwds):
+            self.assertEqual(args, expected_args)
+            self.assertEqual(kwds, expected_kwds)
+
+        expected_args = (123, "abc")
+        expected_kwds = {}
+        f 123, "abc"
+        f 123, *["abc"]
+        expected_kwds = {"foo":"bar"}
+        f 123, "abc", foo="bar"
+        f 123, "abc", **dict(foo="bar")
+        expected_args = ()
+        f foo="bar"
+
+        # See comment in Grammar/Grammar - likely want to change
+        # definition of implicit_arglist to require parens in this case
+        def f2(genexp):
+            self.assertEqual(tuple(genexp), expected_args)
+        expected_args = tuple(x**2 for x in range(10))
+        f2 x**2 for x in range(10)
+
+
+        # Ensure expr{} is reserved for future use
+        try:
+            exec("f {}")
+        except SyntaxError:
+            pass
+        else:
+            self.fail("Implicit call permitted with trailing braces")
+        try:
+            exec("f {'foo': 'bar'}")
+        except SyntaxError:
+            pass
+        else:
+            self.fail("Implicit call permitted with trailing braces")
+
     def test_del_stmt(self):
         # 'del' exprlist
         abc = [1,2,3]

Lib/test/test_import.py

 
     # A few more examples from issue #15425
     def test_syntax_error(self):
-        self.create_module("foo", "invalid syntax is invalid")
+        self.create_module("foo", "import go boom")
         try:
             import foo
         except SyntaxError as e:

Lib/test/test_parser.py

         self.roundtrip(parser.expr, s)
 
     def test_flags_passed(self):
-        # The unicode literals flags has to be passed from the paser to AST
+        # The unicode literals flags has to be passed from the parser to AST
         # generation.
         suite = parser.suite("from __future__ import unicode_literals; x = ''")
         code = suite.compile()
         # expr_stmt
         self.check_suite("a")
 
+    def test_implicit_call(self):
+        self.check_suite("list x**3 for x in range(20)")
+        self.check_suite("list x**3 for x in range(20) if x % 3")
+        self.check_suite("list x**3 for x in range(20) if x % 2 if x % 3")
+        self.check_suite("foo key=value")
+        self.check_suite("foo key=value, *args")
+        self.check_suite("foo key=value, *args, **kw")
+        self.check_suite("foo key=value, **kw")
+        self.check_suite("foo a, b, c, *args")
+        self.check_suite("foo a, b, c, *args, **kw")
+        self.check_suite("foo a, b, c, **kw")
+        self.check_suite("foo a, *args, keyword=23")
+
     def test_simple_assignments(self):
         self.check_suite("a = b")
         self.check_suite("a = b = c = d = e")

Lib/test/test_source_encoding.py

 
     def test_issue2301(self):
         try:
-            compile(b"# coding: cp932\nprint '\x94\x4e'", "dummy", "exec")
+            compile(b"# coding: cp932\nprint '\x94\x4e' bad", "dummy", "exec")
         except SyntaxError as v:
-            self.assertEqual(v.text, "print '\u5e74'\n")
+            self.assertEqual(v.text, "print '\u5e74' bad\n")
         else:
             self.fail()
 

Modules/parsermodule.c

 }
 
 static int
-validate_expr_stmt(node *tree)
+validate_augassign_stmt_trailer(node *tree)
+{
+    int nch = NCH(tree);
+    int res = validate_ntype(tree, augassign_stmt_trailer) &&
+              validate_numnodes(tree, 2, "augassign") &&
+              validate_yield_or_testlist(CHILD(tree, 1), 0);
+
+    if (res) {
+        char *s = STR(CHILD(CHILD(tree, 0), 0));
+
+        res = (strcmp(s, "+=") == 0
+               || strcmp(s, "-=") == 0
+               || strcmp(s, "*=") == 0
+               || strcmp(s, "/=") == 0
+               || strcmp(s, "//=") == 0
+               || strcmp(s, "%=") == 0
+               || strcmp(s, "&=") == 0
+               || strcmp(s, "|=") == 0
+               || strcmp(s, "^=") == 0
+               || strcmp(s, "<<=") == 0
+               || strcmp(s, ">>=") == 0
+               || strcmp(s, "**=") == 0);
+        if (!res)
+            err_string("illegal augmented assignment operator");
+    }
+    return res;
+}
+
+static int
+validate_assign_stmt_trailer(node *tree)
 {
     int j;
     int nch = NCH(tree);
+    int res = validate_ntype(tree, assign_stmt_trailer) &&
+              is_even(nch) && (nch >= 2);
+
+    for (j = 0; res && (j < nch); j += 2)
+        res = validate_equal(CHILD(tree, j)) &&
+              validate_yield_or_testlist(CHILD(tree, j + 1), 1);
+    return res;
+}
+
+static int
+validate_implicit_arglist(node *tree)
+{
+    return (validate_ntype(tree, implicit_arglist) &&
+            validate_numnodes(tree, 1, "implicit_arglist") &&
+            validate_arglist(CHILD(tree, 0)));
+}
+
+static int
+validate_expr_stmt(node *tree)
+{
+    int nch = NCH(tree);
     int res = (validate_ntype(tree, expr_stmt)
-               && is_odd(nch)
+               && (nch == 1 || nch == 2)
                && validate_testlist_star_expr(CHILD(tree, 0)));
 
-    if (res && nch == 3
-        && TYPE(CHILD(tree, 1)) == augassign) {
-        res = validate_numnodes(CHILD(tree, 1), 1, "augassign")
-            && validate_yield_or_testlist(CHILD(tree, 2), 0);
-
-        if (res) {
-            char *s = STR(CHILD(CHILD(tree, 1), 0));
-
-            res = (strcmp(s, "+=") == 0
-                   || strcmp(s, "-=") == 0
-                   || strcmp(s, "*=") == 0
-                   || strcmp(s, "/=") == 0
-                   || strcmp(s, "//=") == 0
-                   || strcmp(s, "%=") == 0
-                   || strcmp(s, "&=") == 0
-                   || strcmp(s, "|=") == 0
-                   || strcmp(s, "^=") == 0
-                   || strcmp(s, "<<=") == 0
-                   || strcmp(s, ">>=") == 0
-                   || strcmp(s, "**=") == 0);
-            if (!res)
-                err_string("illegal augmented assignment operator");
+    if (res && nch == 2) {
+        switch (TYPE(CHILD(tree, 1))) {
+            case augassign_stmt_trailer:
+                res = validate_numnodes(CHILD(tree, 0), 1, "augassign") &&
+                      validate_augassign_stmt_trailer(CHILD(tree, 1));
+                break;
+            case assign_stmt_trailer:
+                res = validate_assign_stmt_trailer(CHILD(tree, 1));
+                break;
+            case implicit_arglist:
+                res = validate_numnodes(CHILD(tree, 0), 1, "implicit_call") &&
+                      validate_implicit_arglist(CHILD(tree, 1));
+                break;
+            default:
+                err_string("illegal expression trailer");
+                res = 0;
+                break;
         }
     }
-    else {
-        for (j = 1; res && (j < nch); j += 2)
-            res = validate_equal(CHILD(tree, j))
-                && validate_yield_or_testlist(CHILD(tree, j + 1), 1);
-    }
-    return (res);
+    return res;
 }
 
 
         return Attribute(left_expr, attr_id, Load,
                          LINENO(CHILD(n, 1)), CHILD(n, 1)->n_col_offset, c->c_arena);
     }
+    else if (TYPE(CHILD(n, 0)) == LBRACE ) {
+        ast_error(c, CHILD(n, 0), "Braces not permitted for implicit call");
+        return NULL;
+    }
     else {
         REQ(CHILD(n, 0), LSQB);
         REQ(CHILD(n, 2), RSQB);
 static expr_ty
 ast_for_testlist(struct compiling *c, const node* n)
 {
-    /* testlist_comp: test (comp_for | (',' test)* [',']) */
-    /* testlist: test (',' test)* [','] */
+    /* testlist_star_expr: (test|star_expr) (',' (test|star_expr))* [',']
+       star_expr: '*' expr
+       test: ... here starts the operator precedence dance
+     */
     assert(NCH(n) > 0);
     if (TYPE(n) == testlist_comp) {
         if (NCH(n) > 1)
     }
 }
 
+
+static stmt_ty
+ast_for_assign_stmt(struct compiling *c, const node* lhs, const node *n)
+{
+    int i;
+    asdl_seq *targets;
+    node *value;
+    expr_ty expression;
+    REQ(lhs, testlist_star_expr);
+    REQ(n, assign_stmt_trailer);
+    /* expr_stmt: testlist_star_expr [(augassign_stmt_trailer |
+                                       assign_stmt_trailer |
+                                       implicit_arglist)]
+       assign_stmt_trailer: ('=' (yield_expr|testlist_star_expr))+
+     */
+
+    /* a normal assignment */
+    REQ(CHILD(n, 0), EQUAL);
+    targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
+    if (!targets)
+        return NULL;
+    for (i = 0; i < NCH(n) - 1; i += 2) {
+        expr_ty e;
+        const node *ch;
+        if (i == 0) {
+            ch = lhs;
+        } else {
+            ch = CHILD(n, i-1);
+        }
+        if (TYPE(ch) == yield_expr) {
+            ast_error(c, ch, "assignment to yield expression not possible");
+            return NULL;
+        }
+        REQ(ch, testlist_star_expr);
+        e = ast_for_testlist(c, ch);
+        if (!e)
+          return NULL;
+
+        /* set context to assign */
+        if (!set_context(c, e, Store, ch))
+          return NULL;
+
+        asdl_seq_SET(targets, i / 2, e);
+    }
+    value = CHILD(n, NCH(n) - 1);
+    if (TYPE(value) == testlist_star_expr)
+        expression = ast_for_testlist(c, value);
+    else {
+        REQ(value, yield_expr);
+        expression = ast_for_expr(c, value);
+    }
+    if (!expression)
+        return NULL;
+    return Assign(targets, expression,
+                  LINENO(lhs), lhs->n_col_offset, c->c_arena);
+}
+
+static stmt_ty
+ast_for_augassign_stmt(struct compiling *c, const node* lhs, const node *n)
+{
+    expr_ty expr1, expr2;
+    operator_ty newoperator;
+    node * rhs;
+    REQ(lhs, testlist_star_expr);
+    REQ(n, augassign_stmt_trailer);
+    /* expr_stmt: testlist_star_expr [(augassign_stmt_trailer |
+                                       assign_stmt_trailer |
+                                       implicit_arglist)]
+       augassign_stmt_trailer: augassign (yield_expr|testlist)
+       augassign: ('+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' |
+                   '<<=' | '>>=' | '**=' | '//=')
+     */
+    expr1 = ast_for_testlist(c, lhs);
+    if (!expr1)
+        return NULL;
+    if(!set_context(c, expr1, Store, lhs))
+        return NULL;
+    /* set_context checks that most expressions are not the left side.
+      Augmented assignments can only have a name, a subscript, or an
+      attribute on the left, though, so we have to explicitly check for
+      those. */
+    switch (expr1->kind) {
+        case Name_kind:
+        case Attribute_kind:
+        case Subscript_kind:
+            break;
+        default:
+            ast_error(c, lhs, "illegal expression for augmented assignment");
+            return NULL;
+    }
+
+    rhs = CHILD(n, 1);
+    if (TYPE(rhs) == testlist)
+        expr2 = ast_for_testlist(c, rhs);
+    else
+        expr2 = ast_for_expr(c, rhs);
+    if (!expr2)
+        return NULL;
+
+    newoperator = ast_for_augassign(c, CHILD(n, 0));
+    if (!newoperator)
+        return NULL;
+
+    return AugAssign(expr1, newoperator, expr2,
+                     LINENO(lhs), lhs->n_col_offset, c->c_arena);
+}
+
+static stmt_ty
+ast_for_implicit_call(struct compiling *c, const node* f, const node *n)
+{
+    expr_ty callable;
+    REQ(f, testlist_star_expr);
+    REQ(n, implicit_arglist);
+    /* expr_stmt: testlist_star_expr [(augassign_stmt_trailer |
+                                       assign_stmt_trailer |
+                                       implicit_arglist)]
+       implicit_arglist: arglist
+     */
+
+    if (NCH(f) > 1) {
+        ast_error(c, f, "Cannot use tuple as callable in implicit call");
+        return NULL;
+    }
+
+    callable = ast_for_testlist(c, f);
+    if (!callable)
+        return NULL;
+    return ast_for_call(c, CHILD(n, 0), callable);
+}
+
 static stmt_ty
 ast_for_expr_stmt(struct compiling *c, const node *n)
 {
+    node *ch;
     REQ(n, expr_stmt);
-    /* expr_stmt: testlist_star_expr (augassign (yield_expr|testlist)
-                | ('=' (yield_expr|testlist))*)
-       testlist_star_expr: (test|star_expr) (',' test|star_expr)* [',']
-       augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^='
-                | '<<=' | '>>=' | '**=' | '//='
-       test: ... here starts the operator precendence dance
+    /* expr_stmt: testlist_star_expr [(augassign_stmt_trailer |
+                                       assign_stmt_trailer |
+                                       implicit_arglist)]
+       testlist_star_expr: (test|star_expr) (',' (test|star_expr))* [',']
+       augassign_stmt_trailer: augassign (yield_expr|testlist)
+       augassign: ('+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' |
+                   '<<=' | '>>=' | '**=' | '//=')
+       assign_stmt_trailer: ('=' (yield_expr|testlist_star_expr))+
+       implicit_arglist: arglist
+       test: ... here starts the operator precedence dance
      */
 
     if (NCH(n) == 1) {
         expr_ty e = ast_for_testlist(c, CHILD(n, 0));
         if (!e)
             return NULL;
-
         return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
     }
-    else if (TYPE(CHILD(n, 1)) == augassign) {
-        expr_ty expr1, expr2;
-        operator_ty newoperator;
-        node *ch = CHILD(n, 0);
-
-        expr1 = ast_for_testlist(c, ch);
-        if (!expr1)
+
+    assert(NCH(n) == 2);
+    ch = CHILD(n, 1);
+    if (TYPE(ch) == implicit_arglist) {
+        expr_ty e = ast_for_implicit_call(c, CHILD(n, 0), ch);
+        if (!e)
             return NULL;
-        if(!set_context(c, expr1, Store, ch))
-            return NULL;
-        /* set_context checks that most expressions are not the left side.
-          Augmented assignments can only have a name, a subscript, or an
-          attribute on the left, though, so we have to explicitly check for
-          those. */
-        switch (expr1->kind) {
-            case Name_kind:
-            case Attribute_kind:
-            case Subscript_kind:
-                break;
-            default:
-                ast_error(c, ch, "illegal expression for augmented assignment");
-                return NULL;
-        }
-
-        ch = CHILD(n, 2);
-        if (TYPE(ch) == testlist)
-            expr2 = ast_for_testlist(c, ch);
-        else
-            expr2 = ast_for_expr(c, ch);
-        if (!expr2)
-            return NULL;
-
-        newoperator = ast_for_augassign(c, CHILD(n, 1));
-        if (!newoperator)
-            return NULL;
-
-        return AugAssign(expr1, newoperator, expr2, LINENO(n), n->n_col_offset, c->c_arena);
+        return Expr(e, LINENO(n), n->n_col_offset, c->c_arena);
     }
-    else {
-        int i;
-        asdl_seq *targets;
-        node *value;
-        expr_ty expression;
-
-        /* a normal assignment */
-        REQ(CHILD(n, 1), EQUAL);
-        targets = asdl_seq_new(NCH(n) / 2, c->c_arena);
-        if (!targets)
-            return NULL;
-        for (i = 0; i < NCH(n) - 2; i += 2) {
-            expr_ty e;
-            node *ch = CHILD(n, i);
-            if (TYPE(ch) == yield_expr) {
-                ast_error(c, ch, "assignment to yield expression not possible");
-                return NULL;
-            }
-            e = ast_for_testlist(c, ch);
-            if (!e)
-              return NULL;
-
-            /* set context to assign */
-            if (!set_context(c, e, Store, CHILD(n, i)))
-              return NULL;
-
-            asdl_seq_SET(targets, i / 2, e);
-        }
-        value = CHILD(n, NCH(n) - 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, LINENO(n), n->n_col_offset, c->c_arena);
+    if (TYPE(ch) == augassign_stmt_trailer) {
+        return ast_for_augassign_stmt(c, CHILD(n, 0), ch);
     }
+    if (TYPE(ch) == assign_stmt_trailer) {
+        return ast_for_assign_stmt(c, CHILD(n, 0), ch);
+    }
+
+    PyErr_Format(PyExc_SystemError,
+                 "unexpected expr_stmt child: %d", TYPE(ch));
+    return NULL;
 }
 
 

Python/graminit.c

 static arc arcs_15_0[1] = {
     {45, 1},
 };
-static arc arcs_15_1[3] = {
+static arc arcs_15_1[4] = {
     {46, 2},
-    {29, 3},
+    {47, 2},
+    {48, 2},
     {0, 1},
 };
-static arc arcs_15_2[2] = {
-    {47, 4},
-    {9, 4},
+static arc arcs_15_2[1] = {
+    {0, 2},
 };
-static arc arcs_15_3[2] = {
-    {47, 5},
-    {45, 5},
-};
-static arc arcs_15_4[1] = {
-    {0, 4},
-};
-static arc arcs_15_5[2] = {
-    {29, 3},
-    {0, 5},
-};
-static state states_15[6] = {
+static state states_15[3] = {
     {1, arcs_15_0},
-    {3, arcs_15_1},
-    {2, arcs_15_2},
-    {2, arcs_15_3},
-    {1, arcs_15_4},
-    {2, arcs_15_5},
+    {4, arcs_15_1},
+    {1, arcs_15_2},
 };
 static arc arcs_16_0[2] = {
     {24, 1},
-    {48, 1},
+    {49, 1},
 };
 static arc arcs_16_1[2] = {
     {30, 2},
 };
 static arc arcs_16_2[3] = {
     {24, 1},
-    {48, 1},
+    {49, 1},
     {0, 2},
 };
 static state states_16[3] = {
     {2, arcs_16_1},
     {3, arcs_16_2},
 };
-static arc arcs_17_0[12] = {
-    {49, 1},
+static arc arcs_17_0[1] = {
     {50, 1},
-    {51, 1},
+};
+static arc arcs_17_1[2] = {
+    {51, 2},
+    {9, 2},
+};
+static arc arcs_17_2[1] = {
+    {0, 2},
+};
+static state states_17[3] = {
+    {1, arcs_17_0},
+    {2, arcs_17_1},
+    {1, arcs_17_2},
+};
+static arc arcs_18_0[12] = {
     {52, 1},
     {53, 1},
     {54, 1},
     {58, 1},
     {59, 1},
     {60, 1},
+    {61, 1},
+    {62, 1},
+    {63, 1},
 };
-static arc arcs_17_1[1] = {
+static arc arcs_18_1[1] = {
     {0, 1},
 };
-static state states_17[2] = {
-    {12, arcs_17_0},
-    {1, arcs_17_1},
+static state states_18[2] = {
+    {12, arcs_18_0},
+    {1, arcs_18_1},
 };
-static arc arcs_18_0[1] = {
-    {61, 1},
+static arc arcs_19_0[1] = {
+    {29, 1},
 };
-static arc arcs_18_1[1] = {
-    {62, 2},
+static arc arcs_19_1[2] = {
+    {51, 2},
+    {45, 2},
 };
-static arc arcs_18_2[1] = {
+static arc arcs_19_2[2] = {
+    {29, 1},
     {0, 2},
 };
-static state states_18[3] = {
-    {1, arcs_18_0},
-    {1, arcs_18_1},
-    {1, arcs_18_2},
+static state states_19[3] = {
+    {1, arcs_19_0},
+    {2, arcs_19_1},
+    {2, arcs_19_2},
 };
-static arc arcs_19_0[1] = {
-    {63, 1},
-};
-static arc arcs_19_1[1] = {
-    {0, 1},
-};
-static state states_19[2] = {
-    {1, arcs_19_0},
-    {1, arcs_19_1},
-};
-static arc arcs_20_0[5] = {
-    {64, 1},
-    {65, 1},
-    {66, 1},
-    {67, 1},
-    {68, 1},
+static arc arcs_20_0[1] = {
+    {14, 1},
 };
 static arc arcs_20_1[1] = {
     {0, 1},
 };
 static state states_20[2] = {
-    {5, arcs_20_0},
+    {1, arcs_20_0},
     {1, arcs_20_1},
 };
 static arc arcs_21_0[1] = {
-    {69, 1},
+    {64, 1},
 };
 static arc arcs_21_1[1] = {
-    {0, 1},
+    {65, 2},
 };
-static state states_21[2] = {
+static arc arcs_21_2[1] = {
+    {0, 2},
+};
+static state states_21[3] = {
     {1, arcs_21_0},
     {1, arcs_21_1},
+    {1, arcs_21_2},
 };
 static arc arcs_22_0[1] = {
-    {70, 1},
+    {66, 1},
 };
 static arc arcs_22_1[1] = {
     {0, 1},
     {1, arcs_22_0},
     {1, arcs_22_1},
 };
-static arc arcs_23_0[1] = {
+static arc arcs_23_0[5] = {
+    {67, 1},
+    {68, 1},
+    {69, 1},
+    {70, 1},
     {71, 1},
 };
-static arc arcs_23_1[2] = {
-    {9, 2},
+static arc arcs_23_1[1] = {
     {0, 1},
 };
-static arc arcs_23_2[1] = {
-    {0, 2},
-};
-static state states_23[3] = {
-    {1, arcs_23_0},
-    {2, arcs_23_1},
-    {1, arcs_23_2},
+static state states_23[2] = {
+    {5, arcs_23_0},
+    {1, arcs_23_1},
 };
 static arc arcs_24_0[1] = {
-    {47, 1},
+    {72, 1},
 };
 static arc arcs_24_1[1] = {
     {0, 1},
     {1, arcs_24_1},
 };
 static arc arcs_25_0[1] = {
-    {72, 1},
+    {73, 1},
 };
-static arc arcs_25_1[2] = {
+static arc arcs_25_1[1] = {
+    {0, 1},
+};
+static state states_25[2] = {
+    {1, arcs_25_0},
+    {1, arcs_25_1},
+};
+static arc arcs_26_0[1] = {
+    {74, 1},
+};
+static arc arcs_26_1[2] = {
+    {9, 2},
+    {0, 1},
+};
+static arc arcs_26_2[1] = {
+    {0, 2},
+};
+static state states_26[3] = {
+    {1, arcs_26_0},
+    {2, arcs_26_1},
+    {1, arcs_26_2},
+};
+static arc arcs_27_0[1] = {
+    {51, 1},
+};
+static arc arcs_27_1[1] = {
+    {0, 1},
+};
+static state states_27[2] = {
+    {1, arcs_27_0},
+    {1, arcs_27_1},
+};
+static arc arcs_28_0[1] = {
+    {75, 1},
+};
+static arc arcs_28_1[2] = {
     {24, 2},
     {0, 1},
 };
-static arc arcs_25_2[2] = {
-    {73, 3},
+static arc arcs_28_2[2] = {
+    {76, 3},
     {0, 2},
 };
-static arc arcs_25_3[1] = {
+static arc arcs_28_3[1] = {
     {24, 4},
 };
-static arc arcs_25_4[1] = {
+static arc arcs_28_4[1] = {
     {0, 4},
 };
-static state states_25[5] = {
-    {1, arcs_25_0},
-    {2, arcs_25_1},
-    {2, arcs_25_2},
-    {1, arcs_25_3},
-    {1, arcs_25_4},
+static state states_28[5] = {
+    {1, arcs_28_0},
+    {2, arcs_28_1},
+    {2, arcs_28_2},
+    {1, arcs_28_3},
+    {1, arcs_28_4},
 };
-static arc arcs_26_0[2] = {
-    {74, 1},
-    {75, 1},
+static arc arcs_29_0[2] = {
+    {77, 1},
+    {78, 1},
 };
-static arc arcs_26_1[1] = {
+static arc arcs_29_1[1] = {
     {0, 1},
 };
-static state states_26[2] = {
-    {2, arcs_26_0},
-    {1, arcs_26_1},
+static state states_29[2] = {
+    {2, arcs_29_0},
+    {1, arcs_29_1},
 };
-static arc arcs_27_0[1] = {
+static arc arcs_30_0[1] = {
+    {79, 1},
+};
+static arc arcs_30_1[1] = {
+    {80, 2},
+};
+static arc arcs_30_2[1] = {
+    {0, 2},
+};
+static state states_30[3] = {
+    {1, arcs_30_0},
+    {1, arcs_30_1},
+    {1, arcs_30_2},
+};
+static arc arcs_31_0[1] = {
     {76, 1},
 };
-static arc arcs_27_1[1] = {
-    {77, 2},
-};
-static arc arcs_27_2[1] = {
-    {0, 2},
-};
-static state states_27[3] = {
-    {1, arcs_27_0},
-    {1, arcs_27_1},
-    {1, arcs_27_2},
-};
-static arc arcs_28_0[1] = {
-    {73, 1},
-};
-static arc arcs_28_1[3] = {
-    {78, 2},
-    {79, 2},
+static arc arcs_31_1[3] = {
+    {81, 2},
+    {82, 2},
     {12, 3},
 };
-static arc arcs_28_2[4] = {
-    {78, 2},
-    {79, 2},
+static arc arcs_31_2[4] = {
+    {81, 2},
+    {82, 2},
     {12, 3},
-    {76, 4},
+    {79, 4},
 };
-static arc arcs_28_3[1] = {
-    {76, 4},
+static arc arcs_31_3[1] = {
+    {79, 4},
 };
-static arc arcs_28_4[3] = {
+static arc arcs_31_4[3] = {
     {31, 5},
     {13, 6},
-    {80, 5},
+    {83, 5},
 };
-static arc arcs_28_5[1] = {
+static arc arcs_31_5[1] = {
     {0, 5},
 };
-static arc arcs_28_6[1] = {
-    {80, 7},
+static arc arcs_31_6[1] = {
+    {83, 7},
 };
-static arc arcs_28_7[1] = {
+static arc arcs_31_7[1] = {
     {15, 5},
 };
-static state states_28[8] = {
-    {1, arcs_28_0},
-    {3, arcs_28_1},
-    {4, arcs_28_2},
-    {1, arcs_28_3},
-    {3, arcs_28_4},
-    {1, arcs_28_5},
-    {1, arcs_28_6},
-    {1, arcs_28_7},
+static state states_31[8] = {
+    {1, arcs_31_0},
+    {3, arcs_31_1},
+    {4, arcs_31_2},
+    {1, arcs_31_3},
+    {3, arcs_31_4},
+    {1, arcs_31_5},
+    {1, arcs_31_6},
+    {1, arcs_31_7},
 };
-static arc arcs_29_0[1] = {
+static arc arcs_32_0[1] = {
     {21, 1},
 };
-static arc arcs_29_1[2] = {
-    {82, 2},
+static arc arcs_32_1[2] = {
+    {85, 2},
     {0, 1},
 };
-static arc arcs_29_2[1] = {
+static arc arcs_32_2[1] = {
     {21, 3},
 };
-static arc arcs_29_3[1] = {
+static arc arcs_32_3[1] = {
     {0, 3},
 };
-static state states_29[4] = {
-    {1, arcs_29_0},
-    {2, arcs_29_1},
-    {1, arcs_29_2},
-    {1, arcs_29_3},
+static state states_32[4] = {
+    {1, arcs_32_0},
+    {2, arcs_32_1},
+    {1, arcs_32_2},
+    {1, arcs_32_3},
 };
-static arc arcs_30_0[1] = {
+static arc arcs_33_0[1] = {
     {12, 1},
 };
-static arc arcs_30_1[2] = {
-    {82, 2},
+static arc arcs_33_1[2] = {
+    {85, 2},
     {0, 1},
 };
-static arc arcs_30_2[1] = {
+static arc arcs_33_2[1] = {
     {21, 3},
 };
-static arc arcs_30_3[1] = {
+static arc arcs_33_3[1] = {
     {0, 3},
 };
-static state states_30[4] = {
-    {1, arcs_30_0},
-    {2, arcs_30_1},
-    {1, arcs_30_2},
-    {1, arcs_30_3},
-};
-static arc arcs_31_0[1] = {
-    {81, 1},
-};
-static arc arcs_31_1[2] = {
-    {30, 2},
-    {0, 1},
-};
-static arc arcs_31_2[2] = {
-    {81, 1},
-    {0, 2},
-};
-static state states_31[3] = {
-    {1, arcs_31_0},
-    {2, arcs_31_1},
-    {2, arcs_31_2},
-};
-static arc arcs_32_0[1] = {
-    {83, 1},
-};
-static arc arcs_32_1[2] = {
-    {30, 0},
-    {0, 1},
-};
-static state states_32[2] = {
-    {1, arcs_32_0},
-    {2, arcs_32_1},
-};
-static arc arcs_33_0[1] = {
-    {21, 1},
-};
-static arc arcs_33_1[2] = {
-    {78, 0},
-    {0, 1},
-};
-static state states_33[2] = {
+static state states_33[4] = {
     {1, arcs_33_0},
     {2, arcs_33_1},
+    {1, arcs_33_2},
+    {1, arcs_33_3},
 };
 static arc arcs_34_0[1] = {
     {84, 1},
 };
-static arc arcs_34_1[1] = {
-    {21, 2},
+static arc arcs_34_1[2] = {
+    {30, 2},
+    {0, 1},
 };
 static arc arcs_34_2[2] = {
-    {30, 1},
+    {84, 1},
     {0, 2},
 };
 static state states_34[3] = {
     {1, arcs_34_0},
-    {1, arcs_34_1},
+    {2, arcs_34_1},
     {2, arcs_34_2},
 };
 static arc arcs_35_0[1] = {
-    {85, 1},
+    {86, 1},
 };
-static arc arcs_35_1[1] = {
+static arc arcs_35_1[2] = {
+    {30, 0},
+    {0, 1},
+};
+static state states_35[2] = {
+    {1, arcs_35_0},
+    {2, arcs_35_1},
+};
+static arc arcs_36_0[1] = {
+    {21, 1},
+};
+static arc arcs_36_1[2] = {
+    {81, 0},
+    {0, 1},
+};
+static state states_36[2] = {
+    {1, arcs_36_0},
+    {2, arcs_36_1},
+};
+static arc arcs_37_0[1] = {
+    {87, 1},
+};
+static arc arcs_37_1[1] = {
     {21, 2},
 };
-static arc arcs_35_2[2] = {
+static arc arcs_37_2[2] = {
     {30, 1},
     {0, 2},
 };
-static state states_35[3] = {
-    {1, arcs_35_0},
-    {1, arcs_35_1},
-    {2, arcs_35_2},
+static state states_37[3] = {
+    {1, arcs_37_0},
+    {1, arcs_37_1},
+    {2, arcs_37_2},
 };
-static arc arcs_36_0[1] = {
-    {86, 1},
+static arc arcs_38_0[1] = {
+    {88, 1},
 };
-static arc arcs_36_1[1] = {
+static arc arcs_38_1[1] = {
+    {21, 2},
+};
+static arc arcs_38_2[2] = {
+    {30, 1},
+    {0, 2},
+};
+static state states_38[3] = {
+    {1, arcs_38_0},
+    {1, arcs_38_1},
+    {2, arcs_38_2},
+};
+static arc arcs_39_0[1] = {
+    {89, 1},
+};
+static arc arcs_39_1[1] = {
     {24, 2},
 };
-static arc arcs_36_2[2] = {
+static arc arcs_39_2[2] = {
     {30, 3},
     {0, 2},
 };
-static arc arcs_36_3[1] = {
+static arc arcs_39_3[1] = {
     {24, 4},
 };
-static arc arcs_36_4[1] = {
+static arc arcs_39_4[1] = {
     {0, 4},
 };
-static state states_36[5] = {
-    {1, arcs_36_0},
-    {1, arcs_36_1},
-    {2, arcs_36_2},
-    {1, arcs_36_3},
-    {1, arcs_36_4},
+static state states_39[5] = {
+    {1, arcs_39_0},
+    {1, arcs_39_1},
+    {2, arcs_39_2},
+    {1, arcs_39_3},
+    {1, arcs_39_4},
 };
-static arc arcs_37_0[8] = {
-    {87, 1},
-    {88, 1},
-    {89, 1},
+static arc arcs_40_0[8] = {
     {90, 1},
     {91, 1},
+    {92, 1},
+    {93, 1},
+    {94, 1},
     {19, 1},
     {18, 1},
     {17, 1},
 };
-static arc arcs_37_1[1] = {
+static arc arcs_40_1[1] = {
     {0, 1},
 };
-static state states_37[2] = {
-    {8, arcs_37_0},
-    {1, arcs_37_1},
+static state states_40[2] = {
+    {8, arcs_40_0},
+    {1, arcs_40_1},
 };
-static arc arcs_38_0[1] = {
-    {92, 1},
+static arc arcs_41_0[1] = {
+    {95, 1},
 };
-static arc arcs_38_1[1] = {
+static arc arcs_41_1[1] = {
     {24, 2},
 };
-static arc arcs_38_2[1] = {
+static arc arcs_41_2[1] = {
     {25, 3},
 };
-static arc arcs_38_3[1] = {
+static arc arcs_41_3[1] = {
     {26, 4},
 };
-static arc arcs_38_4[3] = {
-    {93, 1},
-    {94, 5},
+static arc arcs_41_4[3] = {
+    {96, 1},
+    {97, 5},
     {0, 4},
 };
-static arc arcs_38_5[1] = {
+static arc arcs_41_5[1] = {
     {25, 6},
 };
-static arc arcs_38_6[1] = {
+static arc arcs_41_6[1] = {
     {26, 7},
 };
-static arc arcs_38_7[1] = {
+static arc arcs_41_7[1] = {
     {0, 7},
 };
-static state states_38[8] = {
-    {1, arcs_38_0},
-    {1, arcs_38_1},
-    {1, arcs_38_2},
-    {1, arcs_38_3},
-    {3, arcs_38_4},
-    {1, arcs_38_5},
-    {1, arcs_38_6},
-    {1, arcs_38_7},
-};
-static arc arcs_39_0[1] = {
-    {95, 1},
-};
-static arc arcs_39_1[1] = {
-    {24, 2},
-};
-static arc arcs_39_2[1] = {
-    {25, 3},
-};
-static arc arcs_39_3[1] = {
-    {26, 4},
-};
-static arc arcs_39_4[2] = {
-    {94, 5},
-    {0, 4},
-};
-static arc arcs_39_5[1] = {
-    {25, 6},
-};
-static arc arcs_39_6[1] = {
-    {26, 7},
-};
-static arc arcs_39_7[1] = {
-    {0, 7},
-};
-static state states_39[8] = {
-    {1, arcs_39_0},
-    {1, arcs_39_1},
-    {1, arcs_39_2},
-    {1, arcs_39_3},
-    {2, arcs_39_4},
-    {1, arcs_39_5},
-    {1, arcs_39_6},
-    {1, arcs_39_7},
-};
-static arc arcs_40_0[1] = {
-    {96, 1},
-};
-static arc arcs_40_1[1] = {
-    {62, 2},
-};
-static arc arcs_40_2[1] = {
-    {97, 3},
-};
-static arc arcs_40_3[1] = {
-    {9, 4},
-};
-static arc arcs_40_4[1] = {
-    {25, 5},
-};
-static arc arcs_40_5[1] = {
-    {26, 6},
-};
-static arc arcs_40_6[2] = {
-    {94, 7},
-    {0, 6},
-};
-static arc arcs_40_7[1] = {
-    {25, 8},
-};
-static arc arcs_40_8[1] = {
-    {26, 9},
-};
-static arc arcs_40_9[1] = {
-    {0, 9},
-};
-static state states_40[10] = {
-    {1, arcs_40_0},
-    {1, arcs_40_1},
-    {1, arcs_40_2},
-    {1, arcs_40_3},
-    {1, arcs_40_4},
-    {1, arcs_40_5},
-    {2, arcs_40_6},
-    {1, arcs_40_7},
-    {1, arcs_40_8},
-    {1, arcs_40_9},
-};
-static arc arcs_41_0[1] = {
-    {98, 1},
-};
-static arc arcs_41_1[1] = {
-    {25, 2},
-};
-static arc arcs_41_2[1] = {
-    {26, 3},
-};
-static arc arcs_41_3[2] = {
-    {99, 4},
-    {100, 5},
-};
-static arc arcs_41_4[1] = {
-    {25, 6},
-};
-static arc arcs_41_5[1] = {
-    {25, 7},
-};
-static arc arcs_41_6[1] = {
-    {26, 8},
-};
-static arc arcs_41_7[1] = {
-    {26, 9},
-};
-static arc arcs_41_8[4] = {
-    {99, 4},
-    {94, 10},
-    {100, 5},
-    {0, 8},
-};
-static arc arcs_41_9[1] = {
-    {0, 9},
-};
-static arc arcs_41_10[1] = {
-    {25, 11},
-};
-static arc arcs_41_11[1] = {
-    {26, 12},
-};
-static arc arcs_41_12[2] = {
-    {100, 5},
-    {0, 12},
-};
-static state states_41[13] = {
+static state states_41[8] = {
     {1, arcs_41_0},
     {1, arcs_41_1},
     {1, arcs_41_2},
-    {2, arcs_41_3},
-    {1, arcs_41_4},
+    {1, arcs_41_3},
+    {3, arcs_41_4},
     {1, arcs_41_5},
     {1, arcs_41_6},
     {1, arcs_41_7},
-    {4, arcs_41_8},
-    {1, arcs_41_9},
-    {1, arcs_41_10},
-    {1, arcs_41_11},
-    {2, arcs_41_12},
 };
 static arc arcs_42_0[1] = {
-    {101, 1},
+    {98, 1},
 };
 static arc arcs_42_1[1] = {
-    {102, 2},
+    {24, 2},
 };
-static arc arcs_42_2[2] = {
-    {30, 1},
+static arc arcs_42_2[1] = {
     {25, 3},
 };
 static arc arcs_42_3[1] = {
     {26, 4},
 };
-static arc arcs_42_4[1] = {
+static arc arcs_42_4[2] = {
+    {97, 5},
     {0, 4},
 };
-static state states_42[5] = {
+static arc arcs_42_5[1] = {
+    {25, 6},
+};
+static arc arcs_42_6[1] = {
+    {26, 7},
+};
+static arc arcs_42_7[1] = {
+    {0, 7},
+};
+static state states_42[8] = {
     {1, arcs_42_0},
     {1, arcs_42_1},
-    {2, arcs_42_2},
+    {1, arcs_42_2},
     {1, arcs_42_3},
-    {1, arcs_42_4},
+    {2, arcs_42_4},
+    {1, arcs_42_5},
+    {1, arcs_42_6},
+    {1, arcs_42_7},
 };
 static arc arcs_43_0[1] = {
+    {99, 1},
+};
+static arc arcs_43_1[1] = {
+    {65, 2},
+};
+static arc arcs_43_2[1] = {
+    {100, 3},
+};
+static arc arcs_43_3[1] = {
+    {9, 4},
+};
+static arc arcs_43_4[1] = {
+    {25, 5},
+};
+static arc arcs_43_5[1] = {
+    {26, 6},
+};
+static arc arcs_43_6[2] = {
+    {97, 7},
+    {0, 6},
+};
+static arc arcs_43_7[1] = {
+    {25, 8},
+};
+static arc arcs_43_8[1] = {
+    {26, 9},
+};
+static arc arcs_43_9[1] = {
+    {0, 9},
+};
+static state states_43[10] = {
+    {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},
+    {1, arcs_43_8},
+    {1, arcs_43_9},
+};
+static arc arcs_44_0[1] = {
+    {101, 1},
+};
+static arc arcs_44_1[1] = {
+    {25, 2},
+};
+static arc arcs_44_2[1] = {
+    {26, 3},
+};
+static arc arcs_44_3[2] = {
+    {102, 4},
+    {103, 5},
+};
+static arc arcs_44_4[1] = {
+    {25, 6},
+};
+static arc arcs_44_5[1] = {
+    {25, 7},
+};
+static arc arcs_44_6[1] = {
+    {26, 8},
+};
+static arc arcs_44_7[1] = {
+    {26, 9},
+};
+static arc arcs_44_8[4] = {
+    {102, 4},
+    {97, 10},
+    {103, 5},
+    {0, 8},
+};
+static arc arcs_44_9[1] = {
+    {0, 9},
+};
+static arc arcs_44_10[1] = {
+    {25, 11},
+};
+static arc arcs_44_11[1] = {
+    {26, 12},
+};
+static arc arcs_44_12[2] = {
+    {103, 5},
+    {0, 12},
+};
+static state states_44[13] = {
+    {1, arcs_44_0},
+    {1, arcs_44_1},
+    {1, arcs_44_2},
+    {2, arcs_44_3},
+    {1, arcs_44_4},
+    {1, arcs_44_5},
+    {1, arcs_44_6},
+    {1, arcs_44_7},
+    {4, arcs_44_8},
+    {1, arcs_44_9},
+    {1, arcs_44_10},
+    {1, arcs_44_11},
+    {2, arcs_44_12},
+};
+static arc arcs_45_0[1] = {
+    {104, 1},
+};
+static arc arcs_45_1[1] = {
+    {105, 2},
+};
+static arc arcs_45_2[2] = {
+    {30, 1},
+    {25, 3},
+};
+static arc arcs_45_3[1] = {
+    {26, 4},
+};
+static arc arcs_45_4[1] = {
+    {0, 4},
+};
+static state states_45[5] = {
+    {1, arcs_45_0},
+    {1, arcs_45_1},
+    {2, arcs_45_2},
+    {1, arcs_45_3},
+    {1, arcs_45_4},
+};
+static arc arcs_46_0[1] = {
     {24, 1},
 };
-static arc arcs_43_1[2] = {
-    {82, 2},
+static arc arcs_46_1[2] = {
+    {85, 2},
     {0, 1},
 };
-static arc arcs_43_2[1] = {
-    {103, 3},
+static arc arcs_46_2[1] = {
+    {106, 3},
 };
-static arc arcs_43_3[1] = {
+static arc arcs_46_3[1] = {
     {0, 3},
 };
-static state states_43[4] = {
-    {1, arcs_43_0},
-    {2, arcs_43_1},
-    {1, arcs_43_2},
-    {1, arcs_43_3},
+static state states_46[4] = {
+    {1, arcs_46_0},
+    {2, arcs_46_1},
+    {1, arcs_46_2},
+    {1, arcs_46_3},
 };
-static arc arcs_44_0[1] = {
-    {104, 1},
+static arc arcs_47_0[1] = {
+    {107, 1},
 };
-static arc arcs_44_1[2] = {
+static arc arcs_47_1[2] = {
     {24, 2},
     {0, 1},
 };
-static arc arcs_44_2[2] = {
-    {82, 3},
+static arc arcs_47_2[2] = {
+    {85, 3},
     {0, 2},
 };
-static arc arcs_44_3[1] = {
+static arc arcs_47_3[1] = {
     {21, 4},
 };
-static arc arcs_44_4[1] = {
+static arc arcs_47_4[1] = {
     {0, 4},
 };
-static state states_44[5] = {
-    {1, arcs_44_0},
-    {2, arcs_44_1},
-    {2, arcs_44_2},
-    {1, arcs_44_3},
-    {1, arcs_44_4},
+static state states_47[5] = {
+    {1, arcs_47_0},
+    {2, arcs_47_1},
+    {2, arcs_47_2},
+    {1, arcs_47_3},
+    {1, arcs_47_4},
 };
-static arc arcs_45_0[2] = {
+static arc arcs_48_0[2] = {
     {3, 1},
     {2, 2},
 };
-static arc arcs_45_1[1] = {
+static arc arcs_48_1[1] = {
     {0, 1},
 };
-static arc arcs_45_2[1] = {
-    {105, 3},
+static arc arcs_48_2[1] = {
+    {108, 3},
 };
-static arc arcs_45_3[1] = {
+static arc arcs_48_3[1] = {
     {6, 4},
 };
-static arc arcs_45_4[2] = {
+static arc arcs_48_4[2] = {
     {6, 4},
-    {106, 1},
+    {109, 1},
 };
-static state states_45[5] = {
-    {2, arcs_45_0},
-    {1, arcs_45_1},
-    {1, arcs_45_2},
-    {1, arcs_45_3},
-    {2, arcs_45_4},
+static state states_48[5] = {
+    {2, arcs_48_0},
+    {1, arcs_48_1},
+    {1, arcs_48_2},
+    {1, arcs_48_3},
+    {2, arcs_48_4},
 };
-static arc arcs_46_0[2] = {
-    {107, 1},
-    {108, 2},
+static arc arcs_49_0[2] = {
+    {110, 1},
+    {111, 2},
 };
-static arc arcs_46_1[2] = {
-    {92, 3},
+static arc arcs_49_1[2] = {
+    {95, 3},
     {0, 1},
 };
-static arc arcs_46_2[1] = {
+static arc arcs_49_2[1] = {
     {0, 2},
 };
-static arc arcs_46_3[1] = {
-    {107, 4},
+static arc arcs_49_3[1] = {
+    {110, 4},
 };
-static arc arcs_46_4[1] = {
-    {94, 5},
+static arc arcs_49_4[1] = {
+    {97, 5},
 };
-static arc arcs_46_5[1] = {
+static arc arcs_49_5[1] = {
     {24, 2},
 };
-static state states_46[6] = {
-    {2, arcs_46_0},
-    {2, arcs_46_1},
-    {1, arcs_46_2},
-    {1, arcs_46_3},
-    {1, arcs_46_4},
-    {1, arcs_46_5},
-};
-static arc arcs_47_0[2] = {
-    {107, 1},
-    {110, 1},
-};
-static arc arcs_47_1[1] = {
-    {0, 1},
-};
-static state states_47[2] = {
-    {2, arcs_47_0},
-    {1, arcs_47_1},
-};
-static arc arcs_48_0[1] = {
-    {111, 1},
-};
-static arc arcs_48_1[2] = {
-    {33, 2},
-    {25, 3},
-};
-static arc arcs_48_2[1] = {
-    {25, 3},
-};
-static arc arcs_48_3[1] = {
-    {24, 4},
-};
-static arc arcs_48_4[1] = {
-    {0, 4},
-};
-static state states_48[5] = {
-    {1, arcs_48_0},
-    {2, arcs_48_1},
-    {1, arcs_48_2},
-    {1, arcs_48_3},
-    {1, arcs_48_4},
-};
-static arc arcs_49_0[1] = {
-    {111, 1},
-};
-static arc arcs_49_1[2] = {
-    {33, 2},
-    {25, 3},
-};
-static arc arcs_49_2[1] = {
-    {25, 3},
-};
-static arc arcs_49_3[1] = {
-    {109, 4},
-};
-static arc arcs_49_4[1] = {
-    {0, 4},
-};
-static state states_49[5] = {
-    {1, arcs_49_0},
+static state states_49[6] = {
+    {2, arcs_49_0},
     {2, arcs_49_1},
     {1, arcs_49_2},
     {1, arcs_49_3},
     {1, arcs_49_4},
+    {1, arcs_49_5},
 };
-static arc arcs_50_0[1] = {
-    {112, 1},
+static arc arcs_50_0[2] = {
+    {110, 1},
+    {113, 1},
 };
-static arc arcs_50_1[2] = {
-    {113, 0},
+static arc arcs_50_1[1] = {
     {0, 1},
 };
 static state states_50[2] = {
-    {1, arcs_50_0},
-    {2, arcs_50_1},
+    {2, arcs_50_0},
+    {1, arcs_50_1},
 };
 static arc arcs_51_0[1] = {
     {114, 1},
 };
 static arc arcs_51_1[2] = {
-    {115, 0},
-    {0, 1},
+    {33, 2},
+    {25, 3},
 };
-static state states_51[2] = {
+static arc arcs_51_2[1] = {
+    {25, 3},
+};
+static arc arcs_51_3[1] = {
+    {24, 4},
+};
+static arc arcs_51_4[1] = {
+    {0, 4},
+};
+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 arc arcs_52_0[2] = {
-    {116, 1},
-    {117, 2},
+static arc arcs_52_0[1] = {
+    {114, 1},
 };
-static arc arcs_52_1[1] = {
-    {114, 2},
+static arc arcs_52_1[2] = {
+    {33, 2},
+    {25, 3},
 };
 static arc arcs_52_2[1] = {
-    {0, 2},
+    {25, 3},
 };
-static state states_52[3] = {
-    {2, arcs_52_0},
-    {1, arcs_52_1},
+static arc arcs_52_3[1] = {
+    {112, 4},
+};
+static arc arcs_52_4[1] = {
+    {0, 4},
+};
+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] = {
-    {103, 1},
+    {115, 1},
 };
 static arc arcs_53_1[2] = {
-    {118, 0},
+    {116, 0},
     {0, 1},
 };
 static state states_53[2] = {
     {1, arcs_53_0},
     {2, arcs_53_1},
 };
-static arc arcs_54_0[10] = {
-    {119, 1},
-    {120, 1},
-    {121, 1},
-    {122, 1},
-    {123, 1},
-    {124, 1},
-    {125, 1},
-    {97, 1},
-    {116, 2},
-    {126, 3},
+static arc arcs_54_0[1] = {
+    {117, 1},
 };
-static arc arcs_54_1[1] = {
+static arc arcs_54_1[2] = {
+    {118, 0},
     {0, 1},
 };
-static arc arcs_54_2[1] = {
-    {97, 1},
+static state states_54[2] = {
+    {1, arcs_54_0},
+    {2, arcs_54_1},
 };
-static arc arcs_54_3[2] = {
-    {116, 1},
-    {0, 3},
-};
-static state states_54[4] = {
-    {10, arcs_54_0},
-    {1, arcs_54_1},
-    {1, arcs_54_2},
-    {2, arcs_54_3},
-};
-static arc arcs_55_0[1] = {
-    {31, 1},
+static arc arcs_55_0[2] = {
+    {119, 1},
+    {120, 2},
 };
 static arc arcs_55_1[1] = {
-    {103, 2},
+    {117, 2},
 };
 static arc arcs_55_2[1] = {
     {0, 2},
 };
 static state states_55[3] = {
-    {1, arcs_55_0},
+    {2, arcs_55_0},
     {1, arcs_55_1},
     {1, arcs_55_2},
 };
 static arc arcs_56_0[1] = {
-    {127, 1},
+    {106, 1},
 };
 static arc arcs_56_1[2] = {
-    {128, 0},
+    {121, 0},
     {0, 1},
 };
 static state states_56[2] = {
     {1, arcs_56_0},
     {2, arcs_56_1},
 };
-static arc arcs_57_0[1] = {
-    {129, 1},
+static arc arcs_57_0[10] = {
+    {122, 1},
+    {123, 1},
+    {124, 1},
+    {125, 1},
+    {126, 1},
+    {127, 1},
+    {128, 1},
+    {100, 1},
+    {119, 2},
+    {129, 3},
 };
-static arc arcs_57_1[2] = {
-    {130, 0},
+static arc arcs_57_1[1] = {
     {0, 1},
 };
-static state states_57[2] = {
-    {1, arcs_57_0},
-    {2, arcs_57_1},
+static arc arcs_57_2[1] = {
+    {100, 1},
+};
+static arc arcs_57_3[2] = {
+    {119, 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] = {
-    {131, 1},
+    {31, 1},
 };
-static arc arcs_58_1[2] = {
-    {132, 0},
-    {0, 1},
+static arc arcs_58_1[1] = {
+    {106, 2},
 };
-static state states_58[2] = {
+static arc arcs_58_2[1] = {
+    {0, 2},
+};
+static state states_58[3] = {
     {1, arcs_58_0},
-    {2, arcs_58_1},
+    {1, arcs_58_1},
+    {1, arcs_58_2},
 };
 static arc arcs_59_0[1] = {
-    {133, 1},
+    {130, 1},
 };
-static arc arcs_59_1[3] = {
-    {134, 0},
-    {135, 0},
+static arc arcs_59_1[2] = {
+    {131, 0},
     {0, 1},
 };
 static state states_59[2] = {
     {1, arcs_59_0},
-    {3, arcs_59_1},
+    {2, arcs_59_1},
 };
 static arc arcs_60_0[1] = {
+    {132, 1},
+};
+static arc arcs_60_1[2] = {
+    {133, 0},
+    {0, 1},
+};
+static state states_60[2] = {
+    {1, arcs_60_0},
+    {2, arcs_60_1},
+};
+static arc arcs_61_0[1] = {
+    {134, 1},
+};
+static arc arcs_61_1[2] = {
+    {135, 0},
+    {0, 1},
+};
+static state states_61[2] = {
+    {1, arcs_61_0},
+    {2, arcs_61_1},
+};
+static arc arcs_62_0[1] = {
     {136, 1},
 };
-static arc arcs_60_1[3] = {
+static arc arcs_62_1[3] = {
     {137, 0},
     {138, 0},
     {0, 1},
 };
-static state states_60[2] = {
-    {1, arcs_60_0},
-    {3, arcs_60_1},
+static state states_62[2] = {
+    {1, arcs_62_0},
+    {3, arcs_62_1},
 };
-static arc arcs_61_0[1] = {
+static arc arcs_63_0[1] = {
     {139, 1},
 };
-static arc arcs_61_1[5] = {
-    {31, 0},
+static arc arcs_63_1[3] = {
     {140, 0},
     {141, 0},
-    {142, 0},
     {0, 1},
 };
-static state states_61[2] = {
-    {1, arcs_61_0},
-    {5, arcs_61_1},
+static state states_63[2] = {
+    {1, arcs_63_0},
+    {3, arcs_63_1},
 };
-static arc arcs_62_0[4] = {
-    {137, 1},
-    {138, 1},
-    {143, 1},
-    {144, 2},
+static arc arcs_64_0[1] = {
+    {142, 1},
 };
-static arc arcs_62_1[1] = {
-    {139, 2},
-};
-static arc arcs_62_2[1] = {
-    {0, 2},
-};
-static state states_62[3] = {
-    {4, arcs_62_0},
-    {1, arcs_62_1},
-    {1, arcs_62_2},
-};
-static arc arcs_63_0[1] = {
-    {145, 1},
-};
-static arc arcs_63_1[3] = {
-    {146, 1},
-    {32, 2},
+static arc arcs_64_1[5] = {
+    {31, 0},
+    {143, 0},
+    {144, 0},
+    {145, 0},
     {0, 1},
 };
-static arc arcs_63_2[1] = {
-    {139, 3},
+static state states_64[2] = {
+    {1, arcs_64_0},
+    {5, arcs_64_1},
 };
-static arc arcs_63_3[1] = {
-    {0, 3},
+static arc arcs_65_0[4] = {
+    {140, 1},
+    {141, 1},
+    {146, 1},
+    {147, 2},
 };
-static state states_63[4] = {
-    {1, arcs_63_0},
-    {3, arcs_63_1},
-    {1, arcs_63_2},
-    {1, arcs_63_3},
-};
-static arc arcs_64_0[10] = {
-    {13, 1},
-    {148, 2},
-    {150, 3},
-    {21, 4},
-    {153, 4},
-    {154, 5},
-    {79, 4},
-    {155, 4},
-    {156, 4},
-    {157, 4},
-};
-static arc arcs_64_1[3] = {
-    {47, 6},
-    {147, 6},
-    {15, 4},
-};
-static arc arcs_64_2[2] = {
-    {147, 7},
-    {149, 4},
-};
-static arc arcs_64_3[2] = {
-    {151, 8},
-    {152, 4},
-};
-static arc arcs_64_4[1] = {
-    {0, 4},
-};
-static arc arcs_64_5[2] = {
-    {154, 5},
-    {0, 5},
-};
-static arc arcs_64_6[1] = {
-    {15, 4},
-};
-static arc arcs_64_7[1] = {
-    {149, 4},
-};
-static arc arcs_64_8[1] = {
-    {152, 4},
-};
-static state states_64[9] = {
-    {10, arcs_64_0},
-    {3, arcs_64_1},
-    {2, arcs_64_2},
-    {2, arcs_64_3},
-    {1, arcs_64_4},
-    {2, arcs_64_5},
-    {1, arcs_64_6},
-    {1, arcs_64_7},
-    {1, arcs_64_8},
-};
-static arc arcs_65_0[2] = {
-    {24, 1},
-    {48, 1},
-};
-static arc arcs_65_1[3] = {
-    {158, 2},
-    {30, 3},