]> granicus.if.org Git - python/commitdiff
list comprehensions. see
authorSkip Montanaro <skip@pobox.com>
Sat, 12 Aug 2000 18:09:51 +0000 (18:09 +0000)
committerSkip Montanaro <skip@pobox.com>
Sat, 12 Aug 2000 18:09:51 +0000 (18:09 +0000)
    http://sourceforge.net/patch/?func=detailpatch&patch_id=100654&group_id=5470

for details.

Doc/ref/ref5.tex
Doc/tut/tut.tex
Grammar/Grammar
Include/graminit.h
Lib/test/output/test_grammar
Lib/test/test_grammar.py
Python/compile.c
Python/graminit.c

index db98fe4d0bb5f5ef7d56046ef8cc40878dd0db84..6b699bcc0802f982377c7a9277c056b7b884304b 100644 (file)
@@ -152,13 +152,22 @@ A list display is a possibly empty series of expressions enclosed in
 square brackets:
 
 \begin{verbatim}
-list_display:   "[" [expression_list] "]"
+list_display:   "[" [expression_list [list_iter]] "]"
+list_iter:   list_for | list_if
+list_for:    "for" expression_list "in" testlist [list_iter]
+list_if:     "if" test [list_iter]
 \end{verbatim}
 
-A list display yields a new list object.  If it has no expression
-list, the list object has no items.  Otherwise, the elements of the
-expression list are evaluated from left to right and inserted in the
-list object in that order.
+A list display yields a new list object.  Its contents are specified
+by providing either a list of expressions or a list comprehension.
+When a comma-separated list of expressions is supplied, its elements are
+evaluated from left to right and placed into the list object in that
+order.  When a list comprehension is supplied, it consists of a
+single expression followed by one or more "for" or "if" clauses.  In this
+case, the elements of the new list are those that would be produced
+by considering each of the "for" or "if" clauses a block, nesting from
+left to right, and evaluating the expression to produce a list element
+each time the innermost block is reached.
 \obindex{list}
 \indexii{empty}{list}
 
index b53d6eacc61cfecda89edc108f068b72a54b1621..f81193227c047b1f19301c4062e462b7589ae0b8 100644 (file)
@@ -1753,6 +1753,27 @@ item, then to the result and the next item, and so on.  For example,
 0
 \end{verbatim}
 
+\subsection{List Comprehensions}
+
+List comprehensions provide a concise way to create lists without resorting
+to use of the \func{map()} or \func{filter()} functions.  The resulting
+construct tends often to be clearer than use of those functions.
+
+\begin{verbatim}
+>>> spcs = ["  Apple", " Banana ", "Coco  nut  "]
+>>> print [s.strip() for s in spcs]
+['Apple', 'Banana', 'Coco  nut']
+>>> vec = [2, 4, 6]
+>>> print [3*x for x in vec]
+[6, 12, 18]
+>>> vec1 = [2, 4, 6]
+>>> vec2 = [4, 3, -9]
+>>> print [x*y for x in vec1 for y in vec2]
+[8, 6, -18, 16, 12, -36, 24, 18, -54]
+>>> print [x+y for x in vec1 for y in vec2]
+[6, 5, -7, 8, 7, -5, 10, 9, -3]
+\end{verbatim}
+
 \section{The \keyword{del} statement \label{del}}
 
 There is a way to remove an item from a list given its index instead
index 57a39de2f0011235225b60f301734f0284a8731e..872ec81b6d5d5f0e4e1b724ac99e86ee355302e2 100644 (file)
@@ -74,7 +74,8 @@ arith_expr: term (('+'|'-') term)*
 term: factor (('*'|'/'|'%') factor)*
 factor: ('+'|'-'|'~') factor | power
 power: atom trailer* ('**' factor)*
-atom: '(' [testlist] ')' | '[' [testlist] ']' | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+
+atom: '(' [testlist] ')' | '[' [listmaker] ']' | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+
+listmaker: test ( list_iter | (',' test)* [','] )
 lambdef: 'lambda' [varargslist] ':' test
 trailer: '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME
 subscriptlist: subscript (',' subscript)* [',']
@@ -88,3 +89,7 @@ classdef: 'class' NAME ['(' testlist ')'] ':' suite
 
 arglist: (argument ',')* (argument [',']| '*' test [',' '**' test] | '**' test)
 argument: [test '='] test      # Really [keyword '='] test
+
+list_iter: list_for | list_if
+list_for: 'for' exprlist 'in' testlist [list_iter]
+list_if: 'if' test [list_iter]
index ba66456c114e370ccb522c46355af4b888221dfb..8bb17504bcaf54b67cbaf39db72e38cd57c95344 100644 (file)
 #define factor 299
 #define power 300
 #define atom 301
-#define lambdef 302
-#define trailer 303
-#define subscriptlist 304
-#define subscript 305
-#define sliceop 306
-#define exprlist 307
-#define testlist 308
-#define dictmaker 309
-#define classdef 310
-#define arglist 311
-#define argument 312
+#define listmaker 302
+#define lambdef 303
+#define trailer 304
+#define subscriptlist 305
+#define subscript 306
+#define sliceop 307
+#define exprlist 308
+#define testlist 309
+#define dictmaker 310
+#define classdef 311
+#define arglist 312
+#define argument 313
+#define list_iter 314
+#define list_for 315
+#define list_if 316
index 1926e4d6f76318ea61f1238fa594edb0a2c9ccec..b075d35fe197795ba99c16533482be462842b68d 100644 (file)
@@ -45,3 +45,10 @@ selectors
 
 atoms
 classdef
+['Apple', 'Banana', 'Coco  nut']
+[3, 6, 9, 12, 15]
+[3, 4, 5]
+[(1, 'Apple'), (1, 'Banana'), (1, 'Coconut'), (2, 'Apple'), (2, 'Banana'), (2, 'Coconut'), (3, 'Apple'), (3, 'Banana'), (3, 'Coconut'), (4, 'Apple'), (4, 'Banana'), (4, 'Coconut'), (5, 'Apple'), (5, 'Banana'), (5, 'Coconut')]
+[(1, 'Banana'), (1, 'Coconut'), (2, 'Banana'), (2, 'Coconut'), (3, 'Banana'), (3, 'Coconut'), (4, 'Banana'), (4, 'Coconut'), (5, 'Banana'), (5, 'Coconut')]
+good: got a SyntaxError as expected
+[('Boeing', 'Airliner'), ('Boeing', 'Engine'), ('Ford', 'Engine'), ('Macdonalds', 'Cheeseburger')]
index fa09e8c55d197e584c7e6114c5a0e3c8f5412e19..8eb552261cec858ccb6628fc17524b1cf1ec439c 100644 (file)
@@ -542,3 +542,43 @@ class C:
        def meth1(self): pass
        def meth2(self, arg): pass
        def meth3(self, a1, a2): pass
+
+# list comprehension tests
+nums = [1, 2, 3, 4, 5]
+strs = ["Apple", "Banana", "Coconut"]
+spcs = ["  Apple", " Banana ", "Coco  nut  "]
+
+print [s.strip() for s in spcs]
+print [3 * x for x in nums]
+print [x for x in nums if x > 2]
+print [(i, s) for i in nums for s in strs]
+print [(i, s) for i in nums for s in [f for f in strs if "n" in f]]
+try:
+    eval("[i, s for i in nums for s in strs]")
+    print "FAIL: should have raised a SyntaxError!"
+except SyntaxError:
+    print "good: got a SyntaxError as expected"
+
+suppliers = [
+  (1, "Boeing"),
+  (2, "Ford"),
+  (3, "Macdonalds")
+]
+
+parts = [
+  (10, "Airliner"),
+  (20, "Engine"),
+  (30, "Cheeseburger")
+]
+
+suppart = [
+  (1, 10), (1, 20), (2, 20), (3, 30)
+]
+
+print [
+  (sname, pname)
+    for (sno, sname) in suppliers
+      for (pno, pname) in parts
+        for (sp_sno, sp_pno) in suppart
+          if sno == sp_sno and pno == sp_pno
+]
index 395bd1e07bd2d5ea19b3d6a49b5ca1c9f2a005a3..6e4c548dc5cefb7e09588753dfc864e381ad5238 100644 (file)
@@ -294,6 +294,7 @@ struct compiling {
 #ifdef PRIVATE_NAME_MANGLING
        char *c_private;        /* for private name mangling */
 #endif
+       int c_tmpname;          /* temporary local name counter */
 };
 
 
@@ -368,8 +369,10 @@ static int com_addconst(struct compiling *, PyObject *);
 static int com_addname(struct compiling *, PyObject *);
 static void com_addopname(struct compiling *, int, node *);
 static void com_list(struct compiling *, node *, int);
+static void com_list_iter(struct compiling *, node *, node *, char *);
 static int com_argdefs(struct compiling *, node *);
 static int com_newlocal(struct compiling *, char *);
+static void com_assign(struct compiling *, node *, int);
 static PyCodeObject *icompile(struct _node *, struct compiling *);
 static PyCodeObject *jcompile(struct _node *, char *,
                              struct compiling *);
@@ -419,6 +422,7 @@ com_init(struct compiling *c, char *filename)
        c->c_last_addr = 0;
        c->c_last_line = 0;
        c-> c_lnotab_next = 0;
+       c->c_tmpname = 0;
        return 1;
        
   fail:
@@ -941,18 +945,116 @@ parsestrplus(node *n)
 }
 
 static void
-com_list_constructor(struct compiling *c, node *n)
+com_list_for(struct compiling *c, node *n, node *e, char *t)
 {
-       int len;
-       int i;
-       if (TYPE(n) != testlist)
-               REQ(n, exprlist);
-       /* exprlist: expr (',' expr)* [',']; likewise for testlist */
-       len = (NCH(n) + 1) / 2;
-       for (i = 0; i < NCH(n); i += 2)
-               com_node(c, CHILD(n, i));
-       com_addoparg(c, BUILD_LIST, len);
-       com_pop(c, len-1);
+       PyObject *v;
+       int anchor = 0;
+       int save_begin = c->c_begin;
+
+       /* list_iter: for v in expr [list_iter] */
+       com_node(c, CHILD(n, 3)); /* expr */
+       v = PyInt_FromLong(0L);
+       if (v == NULL)
+               c->c_errors++;
+       com_addoparg(c, LOAD_CONST, com_addconst(c, v));
+       com_push(c, 1);
+       Py_XDECREF(v);
+       c->c_begin = c->c_nexti;
+       com_addoparg(c, SET_LINENO, n->n_lineno);
+       com_addfwref(c, FOR_LOOP, &anchor);
+       com_push(c, 1);
+       com_assign(c, CHILD(n, 1), OP_ASSIGN);
+       c->c_loops++;
+       com_list_iter(c, n, e, t);
+       c->c_loops--;
+       com_addoparg(c, JUMP_ABSOLUTE, c->c_begin);
+       c->c_begin = save_begin;
+       com_backpatch(c, anchor);
+       com_pop(c, 2); /* FOR_LOOP has popped these */
+}  
+
+static void
+com_list_if(struct compiling *c, node *n, node *e, char *t)
+{
+       int anchor = 0;
+       int a = 0;
+       /* list_iter: 'if' test [list_iter] */
+       com_addoparg(c, SET_LINENO, n->n_lineno);
+       com_node(c, CHILD(n, 1));
+       com_addfwref(c, JUMP_IF_FALSE, &a);
+       com_addbyte(c, POP_TOP);
+       com_pop(c, 1);
+       com_list_iter(c, n, e, t);
+       com_addfwref(c, JUMP_FORWARD, &anchor);
+       com_backpatch(c, a);
+       /* We jump here with an extra entry which we now pop */
+       com_addbyte(c, POP_TOP);
+       com_backpatch(c, anchor);
+}
+
+static void
+com_list_iter(struct compiling *c,
+             node *p,          /* parent of list_iter node */
+             node *e,          /* element expression node */
+             char *t           /* name of result list temp local */)
+{
+       /* list_iter is the last child in a listmaker, list_for, or list_if */
+       node *n = CHILD(p, NCH(p)-1);
+       if (TYPE(n) == list_iter) {
+               n = CHILD(n, 0);
+               switch (TYPE(n)) {
+               case list_for: 
+                       com_list_for(c, n, e, t);
+                       break;
+               case list_if:
+                       com_list_if(c, n, e, t);
+                       break;
+               default:
+                       com_error(c, PyExc_SystemError,
+                                 "invalid list_iter node type");
+               }
+       }
+       else {
+               com_addopnamestr(c, LOAD_NAME, t);
+               com_push(c, 1);
+               com_node(c, e);
+               com_addoparg(c, CALL_FUNCTION, 1);
+               com_addbyte(c, POP_TOP);
+               com_pop(c, 2);
+       }
+}
+
+static void
+com_list_comprehension(struct compiling *c, node *n)
+{
+       /* listmaker: test list_iter */
+       char tmpname[12];
+       sprintf(tmpname, "__%d__", ++c->c_tmpname);
+       com_addoparg(c, BUILD_LIST, 0);
+       com_addbyte(c, DUP_TOP); /* leave the result on the stack */
+       com_push(c, 2);
+       com_addopnamestr(c, LOAD_ATTR, "append");
+       com_addopnamestr(c, STORE_NAME, tmpname);
+       com_pop(c, 1);
+       com_list_iter(c, n, CHILD(n, 0), tmpname);
+       com_addopnamestr(c, DELETE_NAME, tmpname);
+       --c->c_tmpname;
+}
+
+static void
+com_listmaker(struct compiling *c, node *n)
+{
+       /* listmaker: test ( list_iter | (',' test)* [','] ) */
+       if (TYPE(CHILD(n, 1)) == list_iter)
+               com_list_comprehension(c, n);
+       else {
+               int len = 0;
+               int i;
+               for (i = 0; i < NCH(n); i += 2, len++)
+                       com_node(c, CHILD(n, i));
+               com_addoparg(c, BUILD_LIST, len);
+               com_pop(c, len-1);
+       }
 }
 
 static void
@@ -990,18 +1092,18 @@ com_atom(struct compiling *c, node *n)
                else
                        com_node(c, CHILD(n, 1));
                break;
-       case LSQB:
+       case LSQB: /* '[' [listmaker] ']' */
                if (TYPE(CHILD(n, 1)) == RSQB) {
                        com_addoparg(c, BUILD_LIST, 0);
                        com_push(c, 1);
                }
                else
-                       com_list_constructor(c, CHILD(n, 1));
+                       com_listmaker(c, CHILD(n, 1));
                break;
        case LBRACE: /* '{' [dictmaker] '}' */
                com_addoparg(c, BUILD_MAP, 0);
                com_push(c, 1);
-               if (TYPE(CHILD(n, 1)) != RBRACE)
+               if (TYPE(CHILD(n, 1)) == dictmaker)
                        com_dictmaker(c, CHILD(n, 1));
                break;
        case BACKQUOTE:
@@ -1743,6 +1845,19 @@ com_assign_sequence(struct compiling *c, node *n, int assigning)
                com_assign(c, CHILD(n, i), assigning);
 }
 
+static void
+com_assign_list(struct compiling *c, node *n, int assigning)
+{
+       int i;
+       if (assigning) {
+               i = (NCH(n)+1)/2;
+               com_addoparg(c, UNPACK_SEQUENCE, i);
+               com_push(c, i-1);
+       }
+       for (i = 0; i < NCH(n); i += 2)
+               com_assign(c, CHILD(n, i), assigning);
+}
+
 static void
 com_assign_name(struct compiling *c, node *n, int assigning)
 {
index 35d8de4ee134c56beca3bcf46819dcd3c640344e..82b01bca278ed5e30921554a6fd1c4ac660f457d 100644 (file)
@@ -896,23 +896,23 @@ static state states_44[4] = {
 static arc arcs_45_0[7] = {
        {16, 1},
        {109, 2},
-       {111, 3},
-       {114, 4},
+       {112, 3},
+       {115, 4},
        {12, 5},
-       {115, 5},
-       {116, 6},
+       {116, 5},
+       {117, 6},
 };
 static arc arcs_45_1[2] = {
        {9, 7},
        {18, 5},
 };
 static arc arcs_45_2[2] = {
-       {9, 8},
-       {110, 5},
+       {110, 8},
+       {111, 5},
 };
 static arc arcs_45_3[2] = {
-       {112, 9},
-       {113, 5},
+       {113, 9},
+       {114, 5},
 };
 static arc arcs_45_4[1] = {
        {9, 10},
@@ -921,20 +921,20 @@ static arc arcs_45_5[1] = {
        {0, 5},
 };
 static arc arcs_45_6[2] = {
-       {116, 6},
+       {117, 6},
        {0, 6},
 };
 static arc arcs_45_7[1] = {
        {18, 5},
 };
 static arc arcs_45_8[1] = {
-       {110, 5},
+       {111, 5},
 };
 static arc arcs_45_9[1] = {
-       {113, 5},
+       {114, 5},
 };
 static arc arcs_45_10[1] = {
-       {114, 5},
+       {115, 5},
 };
 static state states_45[11] = {
        {7, arcs_45_0},
@@ -950,153 +950,163 @@ static state states_45[11] = {
        {1, arcs_45_10},
 };
 static arc arcs_46_0[1] = {
-       {117, 1},
+       {21, 1},
 };
-static arc arcs_46_1[2] = {
-       {17, 2},
-       {14, 3},
+static arc arcs_46_1[3] = {
+       {118, 2},
+       {22, 3},
+       {0, 1},
 };
 static arc arcs_46_2[1] = {
-       {14, 3},
+       {0, 2},
 };
-static arc arcs_46_3[1] = {
+static arc arcs_46_3[2] = {
        {21, 4},
+       {0, 3},
 };
-static arc arcs_46_4[1] = {
+static arc arcs_46_4[2] = {
+       {22, 3},
        {0, 4},
 };
 static state states_46[5] = {
        {1, arcs_46_0},
-       {2, arcs_46_1},
+       {3, arcs_46_1},
        {1, arcs_46_2},
-       {1, arcs_46_3},
-       {1, arcs_46_4},
+       {2, arcs_46_3},
+       {2, arcs_46_4},
 };
-static arc arcs_47_0[3] = {
-       {16, 1},
-       {109, 2},
-       {52, 3},
+static arc arcs_47_0[1] = {
+       {119, 1},
 };
 static arc arcs_47_1[2] = {
-       {118, 4},
-       {18, 5},
+       {17, 2},
+       {14, 3},
 };
 static arc arcs_47_2[1] = {
-       {119, 6},
+       {14, 3},
 };
 static arc arcs_47_3[1] = {
-       {12, 5},
+       {21, 4},
 };
 static arc arcs_47_4[1] = {
-       {18, 5},
-};
-static arc arcs_47_5[1] = {
-       {0, 5},
-};
-static arc arcs_47_6[1] = {
-       {110, 5},
+       {0, 4},
 };
-static state states_47[7] = {
-       {3, arcs_47_0},
+static state states_47[5] = {
+       {1, arcs_47_0},
        {2, arcs_47_1},
        {1, arcs_47_2},
        {1, arcs_47_3},
        {1, arcs_47_4},
-       {1, arcs_47_5},
-       {1, arcs_47_6},
 };
-static arc arcs_48_0[1] = {
-       {120, 1},
+static arc arcs_48_0[3] = {
+       {16, 1},
+       {109, 2},
+       {52, 3},
 };
 static arc arcs_48_1[2] = {
+       {120, 4},
+       {18, 5},
+};
+static arc arcs_48_2[1] = {
+       {121, 6},
+};
+static arc arcs_48_3[1] = {
+       {12, 5},
+};
+static arc arcs_48_4[1] = {
+       {18, 5},
+};
+static arc arcs_48_5[1] = {
+       {0, 5},
+};
+static arc arcs_48_6[1] = {
+       {111, 5},
+};
+static state states_48[7] = {
+       {3, arcs_48_0},
+       {2, arcs_48_1},
+       {1, arcs_48_2},
+       {1, arcs_48_3},
+       {1, arcs_48_4},
+       {1, arcs_48_5},
+       {1, arcs_48_6},
+};
+static arc arcs_49_0[1] = {
+       {122, 1},
+};
+static arc arcs_49_1[2] = {
        {22, 2},
        {0, 1},
 };
-static arc arcs_48_2[2] = {
-       {120, 1},
+static arc arcs_49_2[2] = {
+       {122, 1},
        {0, 2},
 };
-static state states_48[3] = {
-       {1, arcs_48_0},
-       {2, arcs_48_1},
-       {2, arcs_48_2},
+static state states_49[3] = {
+       {1, arcs_49_0},
+       {2, arcs_49_1},
+       {2, arcs_49_2},
 };
-static arc arcs_49_0[3] = {
+static arc arcs_50_0[3] = {
        {52, 1},
        {21, 2},
        {14, 3},
 };
-static arc arcs_49_1[1] = {
+static arc arcs_50_1[1] = {
        {52, 4},
 };
-static arc arcs_49_2[2] = {
+static arc arcs_50_2[2] = {
        {14, 3},
        {0, 2},
 };
-static arc arcs_49_3[3] = {
+static arc arcs_50_3[3] = {
        {21, 5},
-       {121, 6},
+       {123, 6},
        {0, 3},
 };
-static arc arcs_49_4[1] = {
+static arc arcs_50_4[1] = {
        {52, 6},
 };
-static arc arcs_49_5[2] = {
-       {121, 6},
+static arc arcs_50_5[2] = {
+       {123, 6},
        {0, 5},
 };
-static arc arcs_49_6[1] = {
+static arc arcs_50_6[1] = {
        {0, 6},
 };
-static state states_49[7] = {
-       {3, arcs_49_0},
-       {1, arcs_49_1},
-       {2, arcs_49_2},
-       {3, arcs_49_3},
-       {1, arcs_49_4},
-       {2, arcs_49_5},
-       {1, arcs_49_6},
-};
-static arc arcs_50_0[1] = {
-       {14, 1},
-};
-static arc arcs_50_1[2] = {
-       {21, 2},
-       {0, 1},
-};
-static arc arcs_50_2[1] = {
-       {0, 2},
-};
-static state states_50[3] = {
-       {1, arcs_50_0},
-       {2, arcs_50_1},
-       {1, arcs_50_2},
+static state states_50[7] = {
+       {3, arcs_50_0},
+       {1, arcs_50_1},
+       {2, arcs_50_2},
+       {3, arcs_50_3},
+       {1, arcs_50_4},
+       {2, arcs_50_5},
+       {1, arcs_50_6},
 };
 static arc arcs_51_0[1] = {
-       {55, 1},
+       {14, 1},
 };
 static arc arcs_51_1[2] = {
-       {22, 2},
+       {21, 2},
        {0, 1},
 };
-static arc arcs_51_2[2] = {
-       {55, 1},
+static arc arcs_51_2[1] = {
        {0, 2},
 };
 static state states_51[3] = {
        {1, arcs_51_0},
        {2, arcs_51_1},
-       {2, arcs_51_2},
+       {1, arcs_51_2},
 };
 static arc arcs_52_0[1] = {
-       {21, 1},
+       {55, 1},
 };
 static arc arcs_52_1[2] = {
        {22, 2},
        {0, 1},
 };
 static arc arcs_52_2[2] = {
-       {21, 1},
+       {55, 1},
        {0, 2},
 };
 static state states_52[3] = {
@@ -1107,129 +1117,202 @@ static state states_52[3] = {
 static arc arcs_53_0[1] = {
        {21, 1},
 };
-static arc arcs_53_1[1] = {
+static arc arcs_53_1[2] = {
+       {22, 2},
+       {0, 1},
+};
+static arc arcs_53_2[2] = {
+       {21, 1},
+       {0, 2},
+};
+static state states_53[3] = {
+       {1, arcs_53_0},
+       {2, arcs_53_1},
+       {2, arcs_53_2},
+};
+static arc arcs_54_0[1] = {
+       {21, 1},
+};
+static arc arcs_54_1[1] = {
        {14, 2},
 };
-static arc arcs_53_2[1] = {
+static arc arcs_54_2[1] = {
        {21, 3},
 };
-static arc arcs_53_3[2] = {
+static arc arcs_54_3[2] = {
        {22, 4},
        {0, 3},
 };
-static arc arcs_53_4[2] = {
+static arc arcs_54_4[2] = {
        {21, 1},
        {0, 4},
 };
-static state states_53[5] = {
-       {1, arcs_53_0},
-       {1, arcs_53_1},
-       {1, arcs_53_2},
-       {2, arcs_53_3},
-       {2, arcs_53_4},
+static state states_54[5] = {
+       {1, arcs_54_0},
+       {1, arcs_54_1},
+       {1, arcs_54_2},
+       {2, arcs_54_3},
+       {2, arcs_54_4},
 };
-static arc arcs_54_0[1] = {
-       {122, 1},
+static arc arcs_55_0[1] = {
+       {124, 1},
 };
-static arc arcs_54_1[1] = {
+static arc arcs_55_1[1] = {
        {12, 2},
 };
-static arc arcs_54_2[2] = {
+static arc arcs_55_2[2] = {
        {16, 3},
        {14, 4},
 };
-static arc arcs_54_3[1] = {
+static arc arcs_55_3[1] = {
        {9, 5},
 };
-static arc arcs_54_4[1] = {
+static arc arcs_55_4[1] = {
        {15, 6},
 };
-static arc arcs_54_5[1] = {
+static arc arcs_55_5[1] = {
        {18, 7},
 };
-static arc arcs_54_6[1] = {
+static arc arcs_55_6[1] = {
        {0, 6},
 };
-static arc arcs_54_7[1] = {
+static arc arcs_55_7[1] = {
        {14, 4},
 };
-static state states_54[8] = {
-       {1, arcs_54_0},
-       {1, arcs_54_1},
-       {2, arcs_54_2},
-       {1, arcs_54_3},
-       {1, arcs_54_4},
-       {1, arcs_54_5},
-       {1, arcs_54_6},
-       {1, arcs_54_7},
-};
-static arc arcs_55_0[3] = {
-       {123, 1},
+static state states_55[8] = {
+       {1, arcs_55_0},
+       {1, arcs_55_1},
+       {2, arcs_55_2},
+       {1, arcs_55_3},
+       {1, arcs_55_4},
+       {1, arcs_55_5},
+       {1, arcs_55_6},
+       {1, arcs_55_7},
+};
+static arc arcs_56_0[3] = {
+       {125, 1},
        {23, 2},
        {24, 3},
 };
-static arc arcs_55_1[2] = {
+static arc arcs_56_1[2] = {
        {22, 4},
        {0, 1},
 };
-static arc arcs_55_2[1] = {
+static arc arcs_56_2[1] = {
        {21, 5},
 };
-static arc arcs_55_3[1] = {
+static arc arcs_56_3[1] = {
        {21, 6},
 };
-static arc arcs_55_4[4] = {
-       {123, 1},
+static arc arcs_56_4[4] = {
+       {125, 1},
        {23, 2},
        {24, 3},
        {0, 4},
 };
-static arc arcs_55_5[2] = {
+static arc arcs_56_5[2] = {
        {22, 7},
        {0, 5},
 };
-static arc arcs_55_6[1] = {
+static arc arcs_56_6[1] = {
        {0, 6},
 };
-static arc arcs_55_7[1] = {
+static arc arcs_56_7[1] = {
        {24, 3},
 };
-static state states_55[8] = {
-       {3, arcs_55_0},
-       {2, arcs_55_1},
-       {1, arcs_55_2},
-       {1, arcs_55_3},
-       {4, arcs_55_4},
-       {2, arcs_55_5},
-       {1, arcs_55_6},
-       {1, arcs_55_7},
+static state states_56[8] = {
+       {3, arcs_56_0},
+       {2, arcs_56_1},
+       {1, arcs_56_2},
+       {1, arcs_56_3},
+       {4, arcs_56_4},
+       {2, arcs_56_5},
+       {1, arcs_56_6},
+       {1, arcs_56_7},
 };
-static arc arcs_56_0[1] = {
+static arc arcs_57_0[1] = {
        {21, 1},
 };
-static arc arcs_56_1[2] = {
+static arc arcs_57_1[2] = {
        {20, 2},
        {0, 1},
 };
-static arc arcs_56_2[1] = {
+static arc arcs_57_2[1] = {
        {21, 3},
 };
-static arc arcs_56_3[1] = {
+static arc arcs_57_3[1] = {
        {0, 3},
 };
-static state states_56[4] = {
-       {1, arcs_56_0},
-       {2, arcs_56_1},
-       {1, arcs_56_2},
-       {1, arcs_56_3},
+static state states_57[4] = {
+       {1, arcs_57_0},
+       {2, arcs_57_1},
+       {1, arcs_57_2},
+       {1, arcs_57_3},
+};
+static arc arcs_58_0[2] = {
+       {126, 1},
+       {127, 1},
+};
+static arc arcs_58_1[1] = {
+       {0, 1},
+};
+static state states_58[2] = {
+       {2, arcs_58_0},
+       {1, arcs_58_1},
+};
+static arc arcs_59_0[1] = {
+       {67, 1},
 };
-static dfa dfas[57] = {
+static arc arcs_59_1[1] = {
+       {39, 2},
+};
+static arc arcs_59_2[1] = {
+       {56, 3},
+};
+static arc arcs_59_3[1] = {
+       {9, 4},
+};
+static arc arcs_59_4[2] = {
+       {118, 5},
+       {0, 4},
+};
+static arc arcs_59_5[1] = {
+       {0, 5},
+};
+static state states_59[6] = {
+       {1, arcs_59_0},
+       {1, arcs_59_1},
+       {1, arcs_59_2},
+       {1, arcs_59_3},
+       {2, arcs_59_4},
+       {1, arcs_59_5},
+};
+static arc arcs_60_0[1] = {
+       {63, 1},
+};
+static arc arcs_60_1[1] = {
+       {21, 2},
+};
+static arc arcs_60_2[2] = {
+       {118, 3},
+       {0, 2},
+};
+static arc arcs_60_3[1] = {
+       {0, 3},
+};
+static state states_60[4] = {
+       {1, arcs_60_0},
+       {1, arcs_60_1},
+       {2, arcs_60_2},
+       {1, arcs_60_3},
+};
+static dfa dfas[61] = {
        {256, "single_input", 0, 3, states_0,
-        "\004\030\001\000\140\341\153\202\034\200\000\000\060\242\074\004"},
+        "\004\030\001\000\140\341\153\202\034\200\000\000\060\042\271\020"},
        {257, "file_input", 0, 2, states_1,
-        "\204\030\001\000\140\341\153\202\034\200\000\000\060\242\074\004"},
+        "\204\030\001\000\140\341\153\202\034\200\000\000\060\042\271\020"},
        {258, "eval_input", 0, 3, states_2,
-        "\000\020\001\000\000\000\000\000\000\200\000\000\060\242\074\000"},
+        "\000\020\001\000\000\000\000\000\000\200\000\000\060\042\271\000"},
        {259, "funcdef", 0, 6, states_3,
         "\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
        {260, "parameters", 0, 4, states_4,
@@ -1241,13 +1324,13 @@ static dfa dfas[57] = {
        {263, "fplist", 0, 3, states_7,
         "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\000\000"},
        {264, "stmt", 0, 2, states_8,
-        "\000\030\001\000\140\341\153\202\034\200\000\000\060\242\074\004"},
+        "\000\030\001\000\140\341\153\202\034\200\000\000\060\042\271\020"},
        {265, "simple_stmt", 0, 4, states_9,
-        "\000\020\001\000\140\341\153\002\000\200\000\000\060\242\074\000"},
+        "\000\020\001\000\140\341\153\002\000\200\000\000\060\042\271\000"},
        {266, "small_stmt", 0, 2, states_10,
-        "\000\020\001\000\140\341\153\002\000\200\000\000\060\242\074\000"},
+        "\000\020\001\000\140\341\153\002\000\200\000\000\060\042\271\000"},
        {267, "expr_stmt", 0, 2, states_11,
-        "\000\020\001\000\000\000\000\000\000\200\000\000\060\242\074\000"},
+        "\000\020\001\000\000\000\000\000\000\200\000\000\060\042\271\000"},
        {268, "print_stmt", 0, 3, states_12,
         "\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000"},
        {269, "del_stmt", 0, 3, states_13,
@@ -1275,7 +1358,7 @@ static dfa dfas[57] = {
        {280, "assert_stmt", 0, 5, states_24,
         "\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000"},
        {281, "compound_stmt", 0, 2, states_25,
-        "\000\010\000\000\000\000\000\200\034\000\000\000\000\000\000\004"},
+        "\000\010\000\000\000\000\000\200\034\000\000\000\000\000\000\020"},
        {282, "if_stmt", 0, 8, states_26,
         "\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000"},
        {283, "while_stmt", 0, 8, states_27,
@@ -1287,59 +1370,67 @@ static dfa dfas[57] = {
        {286, "except_clause", 0, 5, states_30,
         "\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000"},
        {287, "suite", 0, 5, states_31,
-        "\004\020\001\000\140\341\153\002\000\200\000\000\060\242\074\000"},
+        "\004\020\001\000\140\341\153\002\000\200\000\000\060\042\271\000"},
        {288, "test", 0, 4, states_32,
-        "\000\020\001\000\000\000\000\000\000\200\000\000\060\242\074\000"},
+        "\000\020\001\000\000\000\000\000\000\200\000\000\060\042\271\000"},
        {289, "and_test", 0, 2, states_33,
-        "\000\020\001\000\000\000\000\000\000\200\000\000\060\242\034\000"},
+        "\000\020\001\000\000\000\000\000\000\200\000\000\060\042\071\000"},
        {290, "not_test", 0, 3, states_34,
-        "\000\020\001\000\000\000\000\000\000\200\000\000\060\242\034\000"},
+        "\000\020\001\000\000\000\000\000\000\200\000\000\060\042\071\000"},
        {291, "comparison", 0, 2, states_35,
-        "\000\020\001\000\000\000\000\000\000\000\000\000\060\242\034\000"},
+        "\000\020\001\000\000\000\000\000\000\000\000\000\060\042\071\000"},
        {292, "comp_op", 0, 4, states_36,
         "\000\000\000\000\000\000\000\001\000\200\374\003\000\000\000\000"},
        {293, "expr", 0, 2, states_37,
-        "\000\020\001\000\000\000\000\000\000\000\000\000\060\242\034\000"},
+        "\000\020\001\000\000\000\000\000\000\000\000\000\060\042\071\000"},
        {294, "xor_expr", 0, 2, states_38,
-        "\000\020\001\000\000\000\000\000\000\000\000\000\060\242\034\000"},
+        "\000\020\001\000\000\000\000\000\000\000\000\000\060\042\071\000"},
        {295, "and_expr", 0, 2, states_39,
-        "\000\020\001\000\000\000\000\000\000\000\000\000\060\242\034\000"},
+        "\000\020\001\000\000\000\000\000\000\000\000\000\060\042\071\000"},
        {296, "shift_expr", 0, 2, states_40,
-        "\000\020\001\000\000\000\000\000\000\000\000\000\060\242\034\000"},
+        "\000\020\001\000\000\000\000\000\000\000\000\000\060\042\071\000"},
        {297, "arith_expr", 0, 2, states_41,
-        "\000\020\001\000\000\000\000\000\000\000\000\000\060\242\034\000"},
+        "\000\020\001\000\000\000\000\000\000\000\000\000\060\042\071\000"},
        {298, "term", 0, 2, states_42,
-        "\000\020\001\000\000\000\000\000\000\000\000\000\060\242\034\000"},
+        "\000\020\001\000\000\000\000\000\000\000\000\000\060\042\071\000"},
        {299, "factor", 0, 3, states_43,
-        "\000\020\001\000\000\000\000\000\000\000\000\000\060\242\034\000"},
+        "\000\020\001\000\000\000\000\000\000\000\000\000\060\042\071\000"},
        {300, "power", 0, 4, states_44,
-        "\000\020\001\000\000\000\000\000\000\000\000\000\000\240\034\000"},
+        "\000\020\001\000\000\000\000\000\000\000\000\000\000\040\071\000"},
        {301, "atom", 0, 11, states_45,
-        "\000\020\001\000\000\000\000\000\000\000\000\000\000\240\034\000"},
-       {302, "lambdef", 0, 5, states_46,
-        "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\040\000"},
-       {303, "trailer", 0, 7, states_47,
+        "\000\020\001\000\000\000\000\000\000\000\000\000\000\040\071\000"},
+       {302, "listmaker", 0, 5, states_46,
+        "\000\020\001\000\000\000\000\000\000\200\000\000\060\042\271\000"},
+       {303, "lambdef", 0, 5, states_47,
+        "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000"},
+       {304, "trailer", 0, 7, states_48,
         "\000\000\001\000\000\000\020\000\000\000\000\000\000\040\000\000"},
-       {304, "subscriptlist", 0, 3, states_48,
-        "\000\120\001\000\000\000\020\000\000\200\000\000\060\242\074\000"},
-       {305, "subscript", 0, 7, states_49,
-        "\000\120\001\000\000\000\020\000\000\200\000\000\060\242\074\000"},
-       {306, "sliceop", 0, 3, states_50,
+       {305, "subscriptlist", 0, 3, states_49,
+        "\000\120\001\000\000\000\020\000\000\200\000\000\060\042\271\000"},
+       {306, "subscript", 0, 7, states_50,
+        "\000\120\001\000\000\000\020\000\000\200\000\000\060\042\271\000"},
+       {307, "sliceop", 0, 3, states_51,
         "\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000"},
-       {307, "exprlist", 0, 3, states_51,
-        "\000\020\001\000\000\000\000\000\000\000\000\000\060\242\034\000"},
-       {308, "testlist", 0, 3, states_52,
-        "\000\020\001\000\000\000\000\000\000\200\000\000\060\242\074\000"},
-       {309, "dictmaker", 0, 5, states_53,
-        "\000\020\001\000\000\000\000\000\000\200\000\000\060\242\074\000"},
-       {310, "classdef", 0, 8, states_54,
-        "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004"},
-       {311, "arglist", 0, 8, states_55,
-        "\000\020\201\001\000\000\000\000\000\200\000\000\060\242\074\000"},
-       {312, "argument", 0, 4, states_56,
-        "\000\020\001\000\000\000\000\000\000\200\000\000\060\242\074\000"},
-};
-static label labels[124] = {
+       {308, "exprlist", 0, 3, states_52,
+        "\000\020\001\000\000\000\000\000\000\000\000\000\060\042\071\000"},
+       {309, "testlist", 0, 3, states_53,
+        "\000\020\001\000\000\000\000\000\000\200\000\000\060\042\271\000"},
+       {310, "dictmaker", 0, 5, states_54,
+        "\000\020\001\000\000\000\000\000\000\200\000\000\060\042\271\000"},
+       {311, "classdef", 0, 8, states_55,
+        "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020"},
+       {312, "arglist", 0, 8, states_56,
+        "\000\020\201\001\000\000\000\000\000\200\000\000\060\042\271\000"},
+       {313, "argument", 0, 4, states_57,
+        "\000\020\001\000\000\000\000\000\000\200\000\000\060\042\271\000"},
+       {314, "list_iter", 0, 2, states_58,
+        "\000\000\000\000\000\000\000\200\010\000\000\000\000\000\000\000"},
+       {315, "list_for", 0, 6, states_59,
+        "\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000"},
+       {316, "list_if", 0, 4, states_60,
+        "\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000"},
+};
+static label labels[128] = {
        {0, "EMPTY"},
        {256, 0},
        {4, 0},
@@ -1349,7 +1440,7 @@ static label labels[124] = {
        {264, 0},
        {0, 0},
        {258, 0},
-       {308, 0},
+       {309, 0},
        {259, 0},
        {1, "def"},
        {1, 0},
@@ -1379,7 +1470,7 @@ static label labels[124] = {
        {280, 0},
        {1, "print"},
        {1, "del"},
-       {307, 0},
+       {308, 0},
        {1, "pass"},
        {272, 0},
        {273, 0},
@@ -1402,7 +1493,7 @@ static label labels[124] = {
        {283, 0},
        {284, 0},
        {285, 0},
-       {310, 0},
+       {311, 0},
        {1, "if"},
        {1, "elif"},
        {1, "else"},
@@ -1416,7 +1507,7 @@ static label labels[124] = {
        {6, 0},
        {289, 0},
        {1, "or"},
-       {302, 0},
+       {303, 0},
        {290, 0},
        {1, "and"},
        {1, "not"},
@@ -1448,26 +1539,30 @@ static label labels[124] = {
        {32, 0},
        {300, 0},
        {301, 0},
-       {303, 0},
+       {304, 0},
        {9, 0},
+       {302, 0},
        {10, 0},
        {26, 0},
-       {309, 0},
+       {310, 0},
        {27, 0},
        {25, 0},
        {2, 0},
        {3, 0},
+       {314, 0},
        {1, "lambda"},
-       {311, 0},
-       {304, 0},
+       {312, 0},
        {305, 0},
        {306, 0},
+       {307, 0},
        {1, "class"},
-       {312, 0},
+       {313, 0},
+       {315, 0},
+       {316, 0},
 };
 grammar _PyParser_Grammar = {
-       57,
+       61,
        dfas,
-       {124, labels},
+       {128, labels},
        256
 };