list comprehensions. see

http://sourceforge.net/patch/?func=detailpatch&patch_id=100654&group_id=5470

for details.
This commit is contained in:
Skip Montanaro 2000-08-12 18:09:51 +00:00
parent b16b83534d
commit 803d6e5451
8 changed files with 541 additions and 245 deletions

View 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}

View 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

View 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]

View File

@ -44,14 +44,18 @@
#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

View 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')]

View 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
]

View 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)
{

View 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},
{0, 4},
};
static arc arcs_47_5[1] = {
{0, 5},
};
static arc arcs_47_6[1] = {
{110, 5},
};
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 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_50_0[1] = {
static arc arcs_51_0[1] = {
{14, 1},
};
static arc arcs_50_1[2] = {
static arc arcs_51_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 arc arcs_51_0[1] = {
{55, 1},
};
static arc arcs_51_1[2] = {
{22, 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] = {
{0, 6},
};
static arc arcs_54_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},
{23, 2},
{24, 3},
};
static arc arcs_55_1[2] = {
{22, 4},
{0, 1},
};
static arc arcs_55_2[1] = {
{21, 5},
};
static arc arcs_55_3[1] = {
{21, 6},
};
static arc arcs_55_4[4] = {
{123, 1},
{23, 2},
{24, 3},
{0, 4},
};
static arc arcs_55_5[2] = {
{22, 7},
{0, 5},
};
static arc arcs_55_6[1] = {
{0, 6},
};
static arc arcs_55_7[1] = {
{24, 3},
{14, 4},
};
static state states_55[8] = {
{3, arcs_55_0},
{2, arcs_55_1},
{1, arcs_55_2},
{1, arcs_55_0},
{1, arcs_55_1},
{2, arcs_55_2},
{1, arcs_55_3},
{4, arcs_55_4},
{2, arcs_55_5},
{1, arcs_55_4},
{1, arcs_55_5},
{1, arcs_55_6},
{1, arcs_55_7},
};
static arc arcs_56_0[1] = {
{21, 1},
static arc arcs_56_0[3] = {
{125, 1},
{23, 2},
{24, 3},
};
static arc arcs_56_1[2] = {
{20, 2},
{22, 4},
{0, 1},
};
static arc arcs_56_2[1] = {
{21, 3},
{21, 5},
};
static arc arcs_56_3[1] = {
{0, 3},
{21, 6},
};
static state states_56[4] = {
{1, arcs_56_0},
static arc arcs_56_4[4] = {
{125, 1},
{23, 2},
{24, 3},
{0, 4},
};
static arc arcs_56_5[2] = {
{22, 7},
{0, 5},
};
static arc arcs_56_6[1] = {
{0, 6},
};
static arc arcs_56_7[1] = {
{24, 3},
};
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 dfa dfas[57] = {
static arc arcs_57_0[1] = {
{21, 1},
};
static arc arcs_57_1[2] = {
{20, 2},
{0, 1},
};
static arc arcs_57_2[1] = {
{21, 3},
};
static arc arcs_57_3[1] = {
{0, 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 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"},
{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[124] = {
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
};