diff options
author | Guido van Rossum <guido@python.org> | 2001-08-08 05:00:18 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2001-08-08 05:00:18 (GMT) |
commit | 4668b000a1d9113394941ad39875c827634feb49 (patch) | |
tree | 734560442fef1ce34912ceb772099b9a006e010a | |
parent | 074c9d2b2081237c1071a3775f6e36252cf16ad7 (diff) | |
download | cpython-4668b000a1d9113394941ad39875c827634feb49.zip cpython-4668b000a1d9113394941ad39875c827634feb49.tar.gz cpython-4668b000a1d9113394941ad39875c827634feb49.tar.bz2 |
Implement PEP 238 in its (almost) full glory.
This introduces:
- A new operator // that means floor division (the kind of division
where 1/2 is 0).
- The "future division" statement ("from __future__ import division)
which changes the meaning of the / operator to implement "true
division" (where 1/2 is 0.5).
- New overloadable operators __truediv__ and __floordiv__.
- New slots in the PyNumberMethods struct for true and floor division,
new abstract APIs for them, new opcodes, and so on.
I emphasize that without the future division statement, the semantics
of / will remain unchanged until Python 3.0.
Not yet implemented are warnings (default off) when / is used with int
or long arguments.
This has been on display since 7/31 as SF patch #443474.
Flames to /dev/null.
-rw-r--r-- | Grammar/Grammar | 4 | ||||
-rw-r--r-- | Include/abstract.h | 42 | ||||
-rw-r--r-- | Include/compile.h | 6 | ||||
-rw-r--r-- | Include/object.h | 8 | ||||
-rw-r--r-- | Include/opcode.h | 4 | ||||
-rw-r--r-- | Include/pythonrun.h | 1 | ||||
-rw-r--r-- | Include/token.h | 8 | ||||
-rw-r--r-- | Lib/__future__.py | 1 | ||||
-rw-r--r-- | Objects/abstract.c | 30 | ||||
-rw-r--r-- | Objects/classobject.c | 8 | ||||
-rw-r--r-- | Objects/complexobject.c | 30 | ||||
-rw-r--r-- | Objects/floatobject.c | 45 | ||||
-rw-r--r-- | Objects/intobject.c | 10 | ||||
-rw-r--r-- | Objects/longobject.c | 32 | ||||
-rw-r--r-- | Parser/tokenizer.c | 13 | ||||
-rw-r--r-- | Python/ceval.c | 40 | ||||
-rw-r--r-- | Python/compile.c | 29 | ||||
-rw-r--r-- | Python/future.c | 3 | ||||
-rw-r--r-- | Python/graminit.c | 388 |
19 files changed, 476 insertions, 226 deletions
diff --git a/Grammar/Grammar b/Grammar/Grammar index c791892..d85863e 100644 --- a/Grammar/Grammar +++ b/Grammar/Grammar @@ -38,7 +38,7 @@ stmt: simple_stmt | compound_stmt simple_stmt: small_stmt (';' small_stmt)* [';'] NEWLINE small_stmt: expr_stmt | print_stmt | del_stmt | pass_stmt | flow_stmt | import_stmt | global_stmt | exec_stmt | assert_stmt expr_stmt: testlist (augassign testlist | ('=' testlist)*) -augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | '<<=' | '>>=' | '**=' +augassign: '+=' | '-=' | '*=' | '/=' | '%=' | '&=' | '|=' | '^=' | '<<=' | '>>=' | '**=' | '//=' # For normal assignments, additional restrictions enforced by the interpreter print_stmt: 'print' ( [ test (',' test)* [','] ] | '>>' test [ (',' test)+ [','] ] ) del_stmt: 'del' exprlist @@ -77,7 +77,7 @@ xor_expr: and_expr ('^' and_expr)* and_expr: shift_expr ('&' shift_expr)* shift_expr: arith_expr (('<<'|'>>') arith_expr)* arith_expr: term (('+'|'-') term)* -term: factor (('*'|'/'|'%') factor)* +term: factor (('*'|'/'|'%'|'//') factor)* factor: ('+'|'-'|'~') factor | power power: atom trailer* ('**' factor)* atom: '(' [testlist] ')' | '[' [listmaker] ']' | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING+ diff --git a/Include/abstract.h b/Include/abstract.h index 799438e..f4c1b3e 100644 --- a/Include/abstract.h +++ b/Include/abstract.h @@ -547,6 +547,26 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/ */ + DL_IMPORT(PyObject *) PyNumber_FloorDivide(PyObject *o1, PyObject *o2); + + /* + Returns the result of dividing o1 by o2 giving an integral result, + or null on failure. + This is the equivalent of the Python expression: o1//o2. + + + */ + + DL_IMPORT(PyObject *) PyNumber_TrueDivide(PyObject *o1, PyObject *o2); + + /* + Returns the result of dividing o1 by o2 giving a float result, + or null on failure. + This is the equivalent of the Python expression: o1/o2. + + + */ + DL_IMPORT(PyObject *) PyNumber_Remainder(PyObject *o1, PyObject *o2); /* @@ -742,6 +762,28 @@ xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx*/ */ + DL_IMPORT(PyObject *) PyNumber_InPlaceFloorDivide(PyObject *o1, + PyObject *o2); + + /* + Returns the result of dividing o1 by o2 giving an integral result, + possibly in-place, or null on failure. + This is the equivalent of the Python expression: + o1 /= o2. + + */ + + DL_IMPORT(PyObject *) PyNumber_InPlaceTrueDivide(PyObject *o1, + PyObject *o2); + + /* + Returns the result of dividing o1 by o2 giving a float result, + possibly in-place, or null on failure. + This is the equivalent of the Python expression: + o1 /= o2. + + */ + DL_IMPORT(PyObject *) PyNumber_InPlaceRemainder(PyObject *o1, PyObject *o2); /* diff --git a/Include/compile.h b/Include/compile.h index 89c5ba4..e5840af 100644 --- a/Include/compile.h +++ b/Include/compile.h @@ -41,6 +41,8 @@ typedef struct { effect, this passes on the "from __future__ import generators" state in effect when the code block was compiled. */ #define CO_GENERATOR_ALLOWED 0x1000 +/* XXX Ditto for future division */ +#define CO_FUTURE_DIVISION 0x2000 extern DL_IMPORT(PyTypeObject) PyCode_Type; @@ -64,6 +66,7 @@ typedef struct { int ff_last_lineno; int ff_nested_scopes; int ff_generators; + int ff_division; } PyFutureFeatures; DL_IMPORT(PyFutureFeatures *) PyNode_Future(struct _node *, char *); @@ -76,6 +79,9 @@ DL_IMPORT(PyCodeObject *) PyNode_CompileFlags(struct _node *, char *, #define GENERATORS_DEFAULT 0 #define FUTURE_GENERATORS "generators" +#define DIVISION_DEFAULT 0 +#define FUTURE_DIVISION "division" + /* for internal use only */ #define _PyCode_GETCODEPTR(co, pp) \ ((*(co)->co_code->ob_type->tp_as_buffer->bf_getreadbuffer) \ diff --git a/Include/object.h b/Include/object.h index 9f679b0..f6c6ac6 100644 --- a/Include/object.h +++ b/Include/object.h @@ -161,6 +161,12 @@ typedef struct { binaryfunc nb_inplace_and; binaryfunc nb_inplace_xor; binaryfunc nb_inplace_or; + + /* The following require the Py_TPFLAGS_HAVE_CLASS flag */ + binaryfunc nb_floor_divide; + binaryfunc nb_true_divide; + binaryfunc nb_inplace_floor_divide; + binaryfunc nb_inplace_true_divide; } PyNumberMethods; typedef struct { @@ -396,7 +402,7 @@ given type object has a specified feature. /* tp_iter is defined */ #define Py_TPFLAGS_HAVE_ITER (1L<<7) -/* Experimental stuff for healing the type/class split */ +/* New members introduced by Python 2.2 exist */ #define Py_TPFLAGS_HAVE_CLASS (1L<<8) /* Set if the type object is dynamically allocated */ diff --git a/Include/opcode.h b/Include/opcode.h index c1e8362..9508499 100644 --- a/Include/opcode.h +++ b/Include/opcode.h @@ -29,6 +29,10 @@ extern "C" { #define BINARY_ADD 23 #define BINARY_SUBTRACT 24 #define BINARY_SUBSCR 25 +#define BINARY_FLOOR_DIVIDE 26 +#define BINARY_TRUE_DIVIDE 27 +#define INPLACE_FLOOR_DIVIDE 28 +#define INPLACE_TRUE_DIVIDE 29 #define SLICE 30 /* Also uses 31-33 */ diff --git a/Include/pythonrun.h b/Include/pythonrun.h index 7d947df..55e1ddd 100644 --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -12,6 +12,7 @@ extern "C" { accordingly then. */ #define PyCF_NESTED_SCOPES (0x00000001UL) #define PyCF_GENERATORS (0x00000002UL) +#define PyCF_DIVISION (0x00000004UL) typedef struct { unsigned long cf_flags; /* bitmask of PyCF_xxx flags */ } PyCompilerFlags; diff --git a/Include/token.h b/Include/token.h index 77e3de7..3f58106 100644 --- a/Include/token.h +++ b/Include/token.h @@ -55,10 +55,12 @@ extern "C" { #define LEFTSHIFTEQUAL 45 #define RIGHTSHIFTEQUAL 46 #define DOUBLESTAREQUAL 47 +#define DOUBLESLASH 48 +#define DOUBLESLASHEQUAL 49 /* Don't forget to update the table _PyParser_TokenNames in tokenizer.c! */ -#define OP 48 -#define ERRORTOKEN 49 -#define N_TOKENS 50 +#define OP 50 +#define ERRORTOKEN 51 +#define N_TOKENS 52 /* Special definitions for cooperation with parser */ diff --git a/Lib/__future__.py b/Lib/__future__.py index 65416ae..4cba7ed 100644 --- a/Lib/__future__.py +++ b/Lib/__future__.py @@ -68,3 +68,4 @@ class _Feature: nested_scopes = _Feature((2, 1, 0, "beta", 1), (2, 2, 0, "alpha", 0)) generators = _Feature((2, 2, 0, "alpha", 1), (2, 3, 0, "final", 0)) +division = _Feature((2, 2, 0, "alpha", 2), (3, 0, 0, "alpha", 0)) diff --git a/Objects/abstract.c b/Objects/abstract.c index a0f075f..b646c36 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -565,6 +565,20 @@ PyNumber_Add(PyObject *v, PyObject *w) } PyObject * +PyNumber_FloorDivide(PyObject *v, PyObject *w) +{ + /* XXX tp_flags test */ + return binary_op(v, w, NB_SLOT(nb_floor_divide), "//"); +} + +PyObject * +PyNumber_TrueDivide(PyObject *v, PyObject *w) +{ + /* XXX tp_flags test */ + return binary_op(v, w, NB_SLOT(nb_true_divide), "/"); +} + +PyObject * PyNumber_Remainder(PyObject *v, PyObject *w) { if (PyString_Check(v)) @@ -631,6 +645,22 @@ INPLACE_BINOP(PyNumber_InPlaceSubtract, nb_inplace_subtract, nb_subtract, "-=") INPLACE_BINOP(PyNumber_InPlaceDivide, nb_inplace_divide, nb_divide, "/=") PyObject * +PyNumber_InPlaceFloorDivide(PyObject *v, PyObject *w) +{ + /* XXX tp_flags test */ + return binary_iop(v, w, NB_SLOT(nb_inplace_floor_divide), + NB_SLOT(nb_floor_divide), "//="); +} + +PyObject * +PyNumber_InPlaceTrueDivide(PyObject *v, PyObject *w) +{ + /* XXX tp_flags test */ + return binary_iop(v, w, NB_SLOT(nb_inplace_true_divide), + NB_SLOT(nb_true_divide), "/="); +} + +PyObject * PyNumber_InPlaceAdd(PyObject *v, PyObject *w) { binaryfunc f = NULL; diff --git a/Objects/classobject.c b/Objects/classobject.c index 4bad2fd..9c01538 100644 --- a/Objects/classobject.c +++ b/Objects/classobject.c @@ -1435,6 +1435,8 @@ BINARY(instance_mul, "mul", PyNumber_Multiply) BINARY(instance_div, "div", PyNumber_Divide) BINARY(instance_mod, "mod", PyNumber_Remainder) BINARY(instance_divmod, "divmod", PyNumber_Divmod) +BINARY(instance_floordiv, "floordiv", PyNumber_FloorDivide) +BINARY(instance_truediv, "truediv", PyNumber_TrueDivide) BINARY_INPLACE(instance_ior, "or", PyNumber_InPlaceOr) BINARY_INPLACE(instance_ixor, "xor", PyNumber_InPlaceXor) @@ -1446,6 +1448,8 @@ BINARY_INPLACE(instance_isub, "sub", PyNumber_InPlaceSubtract) BINARY_INPLACE(instance_imul, "mul", PyNumber_InPlaceMultiply) BINARY_INPLACE(instance_idiv, "div", PyNumber_InPlaceDivide) BINARY_INPLACE(instance_imod, "mod", PyNumber_InPlaceRemainder) +BINARY_INPLACE(instance_ifloordiv, "floordiv", PyNumber_InPlaceFloorDivide) +BINARY_INPLACE(instance_itruediv, "truediv", PyNumber_InPlaceTrueDivide) /* Try a 3-way comparison, returning an int; v is an instance. Return: -2 for an exception; @@ -1900,6 +1904,10 @@ static PyNumberMethods instance_as_number = { (binaryfunc)instance_iand, /* nb_inplace_and */ (binaryfunc)instance_ixor, /* nb_inplace_xor */ (binaryfunc)instance_ior, /* nb_inplace_or */ + (binaryfunc)instance_floordiv, /* nb_floor_divide */ + (binaryfunc)instance_truediv, /* nb_true_divide */ + (binaryfunc)instance_ifloordiv, /* nb_inplace_floor_divide */ + (binaryfunc)instance_itruediv, /* nb_inplace_true_divide */ }; PyTypeObject PyInstance_Type = { diff --git a/Objects/complexobject.c b/Objects/complexobject.c index 9a66c0c..5cfb3ca 100644 --- a/Objects/complexobject.c +++ b/Objects/complexobject.c @@ -442,6 +442,21 @@ complex_pow(PyComplexObject *v, PyObject *w, PyComplexObject *z) } static PyObject * +complex_int_div(PyComplexObject *v, PyComplexObject *w) +{ + PyObject *t, *r; + + t = complex_divmod(v, w); + if (t != NULL) { + r = PyTuple_GET_ITEM(t, 0); + Py_INCREF(r); + Py_DECREF(t); + return r; + } + return NULL; +} + +static PyObject * complex_neg(PyComplexObject *v) { Py_complex neg; @@ -859,6 +874,21 @@ static PyNumberMethods complex_as_number = { (unaryfunc)complex_float, /* nb_float */ 0, /* nb_oct */ 0, /* nb_hex */ + 0, /* nb_inplace_add */ + 0, /* nb_inplace_subtract */ + 0, /* nb_inplace_multiply*/ + 0, /* nb_inplace_divide */ + 0, /* nb_inplace_remainder */ + 0, /* nb_inplace_power */ + 0, /* nb_inplace_lshift */ + 0, /* nb_inplace_rshift */ + 0, /* nb_inplace_and */ + 0, /* nb_inplace_xor */ + 0, /* nb_inplace_or */ + (binaryfunc)complex_int_div, /* nb_floor_divide */ + (binaryfunc)complex_div, /* nb_true_divide */ + 0, /* nb_inplace_floor_divide */ + 0, /* nb_inplace_true_divide */ }; PyTypeObject PyComplex_Type = { diff --git a/Objects/floatobject.c b/Objects/floatobject.c index df88736..34b252b 100644 --- a/Objects/floatobject.c +++ b/Objects/floatobject.c @@ -558,6 +558,21 @@ float_pow(PyObject *v, PyObject *w, PyObject *z) } static PyObject * +float_int_div(PyObject *v, PyObject *w) +{ + PyObject *t, *r; + + t = float_divmod(v, w); + if (t != NULL) { + r = PyTuple_GET_ITEM(t, 0); + Py_INCREF(r); + Py_DECREF(t); + return r; + } + return NULL; +} + +static PyObject * float_neg(PyFloatObject *v) { return PyFloat_FromDouble(-v->ob_fval); @@ -678,19 +693,23 @@ static PyNumberMethods float_as_number = { (unaryfunc)float_int, /*nb_int*/ (unaryfunc)float_long, /*nb_long*/ (unaryfunc)float_float, /*nb_float*/ - 0, /*nb_oct*/ - 0, /*nb_hex*/ - 0, /*nb_inplace_add*/ - 0, /*nb_inplace_subtract*/ - 0, /*nb_inplace_multiply*/ - 0, /*nb_inplace_divide*/ - 0, /*nb_inplace_remainder*/ - 0, /*nb_inplace_power*/ - 0, /*nb_inplace_lshift*/ - 0, /*nb_inplace_rshift*/ - 0, /*nb_inplace_and*/ - 0, /*nb_inplace_xor*/ - 0, /*nb_inplace_or*/ + 0, /* nb_oct */ + 0, /* nb_hex */ + 0, /* nb_inplace_add */ + 0, /* nb_inplace_subtract */ + 0, /* nb_inplace_multiply */ + 0, /* nb_inplace_divide */ + 0, /* nb_inplace_remainder */ + 0, /* nb_inplace_power */ + 0, /* nb_inplace_lshift */ + 0, /* nb_inplace_rshift */ + 0, /* nb_inplace_and */ + 0, /* nb_inplace_xor */ + 0, /* nb_inplace_or */ + float_int_div, /* nb_floor_divide */ + float_div, /* nb_true_divide */ + 0, /* nb_inplace_floor_divide */ + 0, /* nb_inplace_true_divide */ }; PyTypeObject PyFloat_Type = { diff --git a/Objects/intobject.c b/Objects/intobject.c index e5106c5..f69f81a 100644 --- a/Objects/intobject.c +++ b/Objects/intobject.c @@ -703,6 +703,12 @@ int_or(PyIntObject *v, PyIntObject *w) } static PyObject * +int_true_divide(PyObject *v, PyObject *w) +{ + return PyFloat_Type.tp_as_number->nb_divide(v, w); +} + +static PyObject * int_int(PyIntObject *v) { Py_INCREF(v); @@ -812,6 +818,10 @@ static PyNumberMethods int_as_number = { 0, /*nb_inplace_and*/ 0, /*nb_inplace_xor*/ 0, /*nb_inplace_or*/ + (binaryfunc)int_div, /* nb_floor_divide */ + int_true_divide, /* nb_true_divide */ + 0, /* nb_inplace_floor_divide */ + 0, /* nb_inplace_true_divide */ }; PyTypeObject PyInt_Type = { diff --git a/Objects/longobject.c b/Objects/longobject.c index 28c3e57..9f7272c 100644 --- a/Objects/longobject.c +++ b/Objects/longobject.c @@ -1981,6 +1981,12 @@ long_or(PyObject *v, PyObject *w) return c; } +static PyObject * +long_true_divide(PyObject *v, PyObject *w) +{ + return PyFloat_Type.tp_as_number->nb_divide(v, w); +} + static int long_coerce(PyObject **pv, PyObject **pw) { @@ -2092,17 +2098,21 @@ static PyNumberMethods long_as_number = { (unaryfunc) long_float, /*nb_float*/ (unaryfunc) long_oct, /*nb_oct*/ (unaryfunc) long_hex, /*nb_hex*/ - 0, /*nb_inplace_add*/ - 0, /*nb_inplace_subtract*/ - 0, /*nb_inplace_multiply*/ - 0, /*nb_inplace_divide*/ - 0, /*nb_inplace_remainder*/ - 0, /*nb_inplace_power*/ - 0, /*nb_inplace_lshift*/ - 0, /*nb_inplace_rshift*/ - 0, /*nb_inplace_and*/ - 0, /*nb_inplace_xor*/ - 0, /*nb_inplace_or*/ + 0, /* nb_inplace_add */ + 0, /* nb_inplace_subtract */ + 0, /* nb_inplace_multiply */ + 0, /* nb_inplace_divide */ + 0, /* nb_inplace_remainder */ + 0, /* nb_inplace_power */ + 0, /* nb_inplace_lshift */ + 0, /* nb_inplace_rshift */ + 0, /* nb_inplace_and */ + 0, /* nb_inplace_xor */ + 0, /* nb_inplace_or */ + (binaryfunc)long_div, /* nb_floor_divide */ + long_true_divide, /* nb_true_divide */ + 0, /* nb_inplace_floor_divide */ + 0, /* nb_inplace_true_divide */ }; PyTypeObject PyLong_Type = { diff --git a/Parser/tokenizer.c b/Parser/tokenizer.c index b783e80..2397969 100644 --- a/Parser/tokenizer.c +++ b/Parser/tokenizer.c @@ -80,6 +80,8 @@ char *_PyParser_TokenNames[] = { "LEFTSHIFTEQUAL", "RIGHTSHIFTEQUAL", "DOUBLESTAREQUAL", + "DOUBLESLASH", + "DOUBLESLASHEQUAL", /* This table must match the #defines in token.h! */ "OP", "<ERRORTOKEN>", @@ -408,6 +410,7 @@ PyToken_TwoChars(int c1, int c2) break; case '/': switch (c2) { + case '/': return DOUBLESLASH; case '=': return SLASHEQUAL; } break; @@ -469,6 +472,16 @@ PyToken_ThreeChars(int c1, int c2, int c3) break; } break; + case '/': + switch (c2) { + case '/': + switch (c3) { + case '=': + return DOUBLESLASHEQUAL; + } + break; + } + break; } return OP; } diff --git a/Python/ceval.c b/Python/ceval.c index e6da9eb..583d7e3 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -884,6 +884,26 @@ eval_frame(PyFrameObject *f) if (x != NULL) continue; break; + case BINARY_FLOOR_DIVIDE: + w = POP(); + v = POP(); + x = PyNumber_FloorDivide(v, w); + Py_DECREF(v); + Py_DECREF(w); + PUSH(x); + if (x != NULL) continue; + break; + + case BINARY_TRUE_DIVIDE: + w = POP(); + v = POP(); + x = PyNumber_TrueDivide(v, w); + Py_DECREF(v); + Py_DECREF(w); + PUSH(x); + if (x != NULL) continue; + break; + case BINARY_MODULO: w = POP(); v = POP(); @@ -1051,6 +1071,26 @@ eval_frame(PyFrameObject *f) if (x != NULL) continue; break; + case INPLACE_FLOOR_DIVIDE: + w = POP(); + v = POP(); + x = PyNumber_InPlaceFloorDivide(v, w); + Py_DECREF(v); + Py_DECREF(w); + PUSH(x); + if (x != NULL) continue; + break; + + case INPLACE_TRUE_DIVIDE: + w = POP(); + v = POP(); + x = PyNumber_InPlaceTrueDivide(v, w); + Py_DECREF(v); + Py_DECREF(w); + PUSH(x); + if (x != NULL) continue; + break; + case INPLACE_MODULO: w = POP(); v = POP(); diff --git a/Python/compile.c b/Python/compile.c index 31a75bd..d310e35 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1874,14 +1874,20 @@ com_term(struct compiling *c, node *n) op = BINARY_MULTIPLY; break; case SLASH: - op = BINARY_DIVIDE; + if (c->c_flags & CO_FUTURE_DIVISION) + op = BINARY_TRUE_DIVIDE; + else + op = BINARY_DIVIDE; break; case PERCENT: op = BINARY_MODULO; break; + case DOUBLESLASH: + op = BINARY_FLOOR_DIVIDE; + break; default: com_error(c, PyExc_SystemError, - "com_term: operator not *, / or %"); + "com_term: operator not *, /, // or %"); op = 255; } com_addbyte(c, op); @@ -2475,7 +2481,14 @@ com_augassign(struct compiling *c, node *n) switch (STR(CHILD(CHILD(n, 1), 0))[0]) { case '+': opcode = INPLACE_ADD; break; case '-': opcode = INPLACE_SUBTRACT; break; - case '/': opcode = INPLACE_DIVIDE; break; + case '/': + if (STR(CHILD(CHILD(n, 1), 0))[1] == '/') + opcode = INPLACE_FLOOR_DIVIDE; + else if (c->c_flags & CO_FUTURE_DIVISION) + opcode = INPLACE_TRUE_DIVIDE; + else + opcode = INPLACE_DIVIDE; + break; case '%': opcode = INPLACE_MODULO; break; case '<': opcode = INPLACE_LSHIFT; break; case '>': opcode = INPLACE_RSHIFT; break; @@ -3945,7 +3958,8 @@ jcompile(node *n, char *filename, struct compiling *base, if (base->c_nested || (sc.c_symtable->st_cur->ste_type == TYPE_FUNCTION)) sc.c_nested = 1; - sc.c_flags |= base->c_flags & CO_GENERATOR_ALLOWED; + sc.c_flags |= base->c_flags & (CO_GENERATOR_ALLOWED | + CO_FUTURE_DIVISION); } else { sc.c_private = NULL; sc.c_future = PyNode_Future(n, filename); @@ -3963,6 +3977,11 @@ jcompile(node *n, char *filename, struct compiling *base, sc.c_future->ff_generators = 1; else if (sc.c_future->ff_generators) flags->cf_flags |= PyCF_GENERATORS; + + if (flags->cf_flags & PyCF_DIVISION) + sc.c_future->ff_division = 1; + else if (sc.c_future->ff_division) + flags->cf_flags |= PyCF_DIVISION; } if (symtable_build(&sc, n) < 0) { com_free(&sc); @@ -4437,6 +4456,8 @@ symtable_update_flags(struct compiling *c, PySymtableEntryObject *ste, c->c_flags |= CO_NESTED; if (c->c_future->ff_generators) c->c_flags |= CO_GENERATOR_ALLOWED; + if (c->c_future->ff_division) + c->c_flags |= CO_FUTURE_DIVISION; } if (ste->ste_generator) c->c_flags |= CO_GENERATOR; diff --git a/Python/future.c b/Python/future.c index fc0d748..db62b5b 100644 --- a/Python/future.c +++ b/Python/future.c @@ -33,6 +33,8 @@ future_check_features(PyFutureFeatures *ff, node *n, char *filename) ff->ff_nested_scopes = 1; } else if (strcmp(feature, FUTURE_GENERATORS) == 0) { ff->ff_generators = 1; + } else if (strcmp(feature, FUTURE_DIVISION) == 0) { + ff->ff_division = 1; } else if (strcmp(feature, "braces") == 0) { PyErr_SetString(PyExc_SyntaxError, "not a chance"); @@ -234,6 +236,7 @@ PyNode_Future(node *n, char *filename) ff->ff_last_lineno = -1; ff->ff_nested_scopes = 0; ff->ff_generators = 0; + ff->ff_division = 0; if (future_parse(ff, n, filename) < 0) { PyMem_Free((void *)ff); diff --git a/Python/graminit.c b/Python/graminit.c index a960730..176f62d 100644 --- a/Python/graminit.c +++ b/Python/graminit.c @@ -252,7 +252,7 @@ static state states_11[6] = { {1, arcs_11_4}, {2, arcs_11_5}, }; -static arc arcs_12_0[11] = { +static arc arcs_12_0[12] = { {38, 1}, {39, 1}, {40, 1}, @@ -264,20 +264,21 @@ static arc arcs_12_0[11] = { {46, 1}, {47, 1}, {48, 1}, + {49, 1}, }; static arc arcs_12_1[1] = { {0, 1}, }; static state states_12[2] = { - {11, arcs_12_0}, + {12, arcs_12_0}, {1, arcs_12_1}, }; static arc arcs_13_0[1] = { - {49, 1}, + {50, 1}, }; static arc arcs_13_1[3] = { {21, 2}, - {50, 3}, + {51, 3}, {0, 1}, }; static arc arcs_13_2[2] = { @@ -318,10 +319,10 @@ static state states_13[9] = { {2, arcs_13_8}, }; static arc arcs_14_0[1] = { - {51, 1}, + {52, 1}, }; static arc arcs_14_1[1] = { - {52, 2}, + {53, 2}, }; static arc arcs_14_2[1] = { {0, 2}, @@ -332,7 +333,7 @@ static state states_14[3] = { {1, arcs_14_2}, }; static arc arcs_15_0[1] = { - {53, 1}, + {54, 1}, }; static arc arcs_15_1[1] = { {0, 1}, @@ -342,11 +343,11 @@ static state states_15[2] = { {1, arcs_15_1}, }; static arc arcs_16_0[5] = { - {54, 1}, {55, 1}, {56, 1}, {57, 1}, {58, 1}, + {59, 1}, }; static arc arcs_16_1[1] = { {0, 1}, @@ -356,7 +357,7 @@ static state states_16[2] = { {1, arcs_16_1}, }; static arc arcs_17_0[1] = { - {59, 1}, + {60, 1}, }; static arc arcs_17_1[1] = { {0, 1}, @@ -366,7 +367,7 @@ static state states_17[2] = { {1, arcs_17_1}, }; static arc arcs_18_0[1] = { - {60, 1}, + {61, 1}, }; static arc arcs_18_1[1] = { {0, 1}, @@ -376,7 +377,7 @@ static state states_18[2] = { {1, arcs_18_1}, }; static arc arcs_19_0[1] = { - {61, 1}, + {62, 1}, }; static arc arcs_19_1[2] = { {9, 2}, @@ -391,7 +392,7 @@ static state states_19[3] = { {1, arcs_19_2}, }; static arc arcs_20_0[1] = { - {62, 1}, + {63, 1}, }; static arc arcs_20_1[1] = { {9, 2}, @@ -405,7 +406,7 @@ static state states_20[3] = { {1, arcs_20_2}, }; static arc arcs_21_0[1] = { - {63, 1}, + {64, 1}, }; static arc arcs_21_1[2] = { {21, 2}, @@ -438,25 +439,25 @@ static state states_21[7] = { {1, arcs_21_6}, }; static arc arcs_22_0[2] = { - {64, 1}, - {66, 2}, + {65, 1}, + {67, 2}, }; static arc arcs_22_1[1] = { - {65, 3}, + {66, 3}, }; static arc arcs_22_2[1] = { - {67, 4}, + {68, 4}, }; static arc arcs_22_3[2] = { {22, 1}, {0, 3}, }; static arc arcs_22_4[1] = { - {64, 5}, + {65, 5}, }; static arc arcs_22_5[2] = { {23, 6}, - {68, 7}, + {69, 7}, }; static arc arcs_22_6[1] = { {0, 6}, @@ -466,7 +467,7 @@ static arc arcs_22_7[2] = { {0, 7}, }; static arc arcs_22_8[1] = { - {68, 7}, + {69, 7}, }; static state states_22[9] = { {2, arcs_22_0}, @@ -499,7 +500,7 @@ static state states_23[4] = { {1, arcs_23_3}, }; static arc arcs_24_0[1] = { - {67, 1}, + {68, 1}, }; static arc arcs_24_1[2] = { {12, 2}, @@ -521,7 +522,7 @@ static arc arcs_25_0[1] = { {12, 1}, }; static arc arcs_25_1[2] = { - {69, 0}, + {70, 0}, {0, 1}, }; static state states_25[2] = { @@ -529,7 +530,7 @@ static state states_25[2] = { {2, arcs_25_1}, }; static arc arcs_26_0[1] = { - {70, 1}, + {71, 1}, }; static arc arcs_26_1[1] = { {12, 2}, @@ -544,13 +545,13 @@ static state states_26[3] = { {2, arcs_26_2}, }; static arc arcs_27_0[1] = { - {71, 1}, + {72, 1}, }; static arc arcs_27_1[1] = { - {72, 2}, + {73, 2}, }; static arc arcs_27_2[2] = { - {73, 3}, + {74, 3}, {0, 2}, }; static arc arcs_27_3[1] = { @@ -576,7 +577,7 @@ static state states_27[7] = { {1, arcs_27_6}, }; static arc arcs_28_0[1] = { - {74, 1}, + {75, 1}, }; static arc arcs_28_1[1] = { {21, 2}, @@ -599,12 +600,12 @@ static state states_28[5] = { {1, arcs_28_4}, }; static arc arcs_29_0[6] = { - {75, 1}, {76, 1}, {77, 1}, {78, 1}, - {10, 1}, {79, 1}, + {10, 1}, + {80, 1}, }; static arc arcs_29_1[1] = { {0, 1}, @@ -614,7 +615,7 @@ static state states_29[2] = { {1, arcs_29_1}, }; static arc arcs_30_0[1] = { - {80, 1}, + {81, 1}, }; static arc arcs_30_1[1] = { {21, 2}, @@ -626,8 +627,8 @@ static arc arcs_30_3[1] = { {15, 4}, }; static arc arcs_30_4[3] = { - {81, 1}, - {82, 5}, + {82, 1}, + {83, 5}, {0, 4}, }; static arc arcs_30_5[1] = { @@ -650,7 +651,7 @@ static state states_30[8] = { {1, arcs_30_7}, }; static arc arcs_31_0[1] = { - {83, 1}, + {84, 1}, }; static arc arcs_31_1[1] = { {21, 2}, @@ -662,7 +663,7 @@ static arc arcs_31_3[1] = { {15, 4}, }; static arc arcs_31_4[2] = { - {82, 5}, + {83, 5}, {0, 4}, }; static arc arcs_31_5[1] = { @@ -685,13 +686,13 @@ static state states_31[8] = { {1, arcs_31_7}, }; static arc arcs_32_0[1] = { - {84, 1}, + {85, 1}, }; static arc arcs_32_1[1] = { - {52, 2}, + {53, 2}, }; static arc arcs_32_2[1] = { - {73, 3}, + {74, 3}, }; static arc arcs_32_3[1] = { {9, 4}, @@ -703,7 +704,7 @@ static arc arcs_32_5[1] = { {15, 6}, }; static arc arcs_32_6[2] = { - {82, 7}, + {83, 7}, {0, 6}, }; static arc arcs_32_7[1] = { @@ -728,7 +729,7 @@ static state states_32[10] = { {1, arcs_32_9}, }; static arc arcs_33_0[1] = { - {85, 1}, + {86, 1}, }; static arc arcs_33_1[1] = { {14, 2}, @@ -737,8 +738,8 @@ static arc arcs_33_2[1] = { {15, 3}, }; static arc arcs_33_3[2] = { - {86, 4}, - {87, 5}, + {87, 4}, + {88, 5}, }; static arc arcs_33_4[1] = { {14, 6}, @@ -753,8 +754,8 @@ static arc arcs_33_7[1] = { {15, 9}, }; static arc arcs_33_8[3] = { - {86, 4}, - {82, 5}, + {87, 4}, + {83, 5}, {0, 8}, }; static arc arcs_33_9[1] = { @@ -773,7 +774,7 @@ static state states_33[10] = { {1, arcs_33_9}, }; static arc arcs_34_0[1] = { - {88, 1}, + {89, 1}, }; static arc arcs_34_1[2] = { {21, 2}, @@ -804,14 +805,14 @@ static arc arcs_35_1[1] = { {0, 1}, }; static arc arcs_35_2[1] = { - {89, 3}, + {90, 3}, }; static arc arcs_35_3[1] = { {6, 4}, }; static arc arcs_35_4[2] = { {6, 4}, - {90, 1}, + {91, 1}, }; static state states_35[5] = { {2, arcs_35_0}, @@ -821,18 +822,18 @@ static state states_35[5] = { {2, arcs_35_4}, }; static arc arcs_36_0[2] = { - {91, 1}, - {93, 2}, + {92, 1}, + {94, 2}, }; static arc arcs_36_1[2] = { - {92, 3}, + {93, 3}, {0, 1}, }; static arc arcs_36_2[1] = { {0, 2}, }; static arc arcs_36_3[1] = { - {91, 1}, + {92, 1}, }; static state states_36[4] = { {2, arcs_36_0}, @@ -841,10 +842,10 @@ static state states_36[4] = { {1, arcs_36_3}, }; static arc arcs_37_0[1] = { - {94, 1}, + {95, 1}, }; static arc arcs_37_1[2] = { - {95, 0}, + {96, 0}, {0, 1}, }; static state states_37[2] = { @@ -852,11 +853,11 @@ static state states_37[2] = { {2, arcs_37_1}, }; static arc arcs_38_0[2] = { - {96, 1}, - {97, 2}, + {97, 1}, + {98, 2}, }; static arc arcs_38_1[1] = { - {94, 2}, + {95, 2}, }; static arc arcs_38_2[1] = { {0, 2}, @@ -867,10 +868,10 @@ static state states_38[3] = { {1, arcs_38_2}, }; static arc arcs_39_0[1] = { - {72, 1}, + {73, 1}, }; static arc arcs_39_1[2] = { - {98, 0}, + {99, 0}, {0, 1}, }; static state states_39[2] = { @@ -878,25 +879,25 @@ static state states_39[2] = { {2, arcs_39_1}, }; static arc arcs_40_0[10] = { - {99, 1}, {100, 1}, {101, 1}, {102, 1}, {103, 1}, {104, 1}, {105, 1}, - {73, 1}, - {96, 2}, - {106, 3}, + {106, 1}, + {74, 1}, + {97, 2}, + {107, 3}, }; static arc arcs_40_1[1] = { {0, 1}, }; static arc arcs_40_2[1] = { - {73, 1}, + {74, 1}, }; static arc arcs_40_3[2] = { - {96, 1}, + {97, 1}, {0, 3}, }; static state states_40[4] = { @@ -906,10 +907,10 @@ static state states_40[4] = { {2, arcs_40_3}, }; static arc arcs_41_0[1] = { - {107, 1}, + {108, 1}, }; static arc arcs_41_1[2] = { - {108, 0}, + {109, 0}, {0, 1}, }; static state states_41[2] = { @@ -917,10 +918,10 @@ static state states_41[2] = { {2, arcs_41_1}, }; static arc arcs_42_0[1] = { - {109, 1}, + {110, 1}, }; static arc arcs_42_1[2] = { - {110, 0}, + {111, 0}, {0, 1}, }; static state states_42[2] = { @@ -928,10 +929,10 @@ static state states_42[2] = { {2, arcs_42_1}, }; static arc arcs_43_0[1] = { - {111, 1}, + {112, 1}, }; static arc arcs_43_1[2] = { - {112, 0}, + {113, 0}, {0, 1}, }; static state states_43[2] = { @@ -939,11 +940,11 @@ static state states_43[2] = { {2, arcs_43_1}, }; static arc arcs_44_0[1] = { - {113, 1}, + {114, 1}, }; static arc arcs_44_1[3] = { - {114, 0}, - {50, 0}, + {115, 0}, + {51, 0}, {0, 1}, }; static state states_44[2] = { @@ -951,11 +952,11 @@ static state states_44[2] = { {3, arcs_44_1}, }; static arc arcs_45_0[1] = { - {115, 1}, + {116, 1}, }; static arc arcs_45_1[3] = { - {116, 0}, {117, 0}, + {118, 0}, {0, 1}, }; static state states_45[2] = { @@ -963,26 +964,27 @@ static state states_45[2] = { {3, arcs_45_1}, }; static arc arcs_46_0[1] = { - {118, 1}, + {119, 1}, }; -static arc arcs_46_1[4] = { +static arc arcs_46_1[5] = { {23, 0}, - {119, 0}, {120, 0}, + {121, 0}, + {122, 0}, {0, 1}, }; static state states_46[2] = { {1, arcs_46_0}, - {4, arcs_46_1}, + {5, arcs_46_1}, }; static arc arcs_47_0[4] = { - {116, 1}, {117, 1}, - {121, 1}, - {122, 2}, + {118, 1}, + {123, 1}, + {124, 2}, }; static arc arcs_47_1[1] = { - {118, 2}, + {119, 2}, }; static arc arcs_47_2[1] = { {0, 2}, @@ -993,15 +995,15 @@ static state states_47[3] = { {1, arcs_47_2}, }; static arc arcs_48_0[1] = { - {123, 1}, + {125, 1}, }; static arc arcs_48_1[3] = { - {124, 1}, + {126, 1}, {24, 2}, {0, 1}, }; static arc arcs_48_2[1] = { - {118, 3}, + {119, 3}, }; static arc arcs_48_3[2] = { {24, 2}, @@ -1015,24 +1017,24 @@ static state states_48[4] = { }; static arc arcs_49_0[7] = { {16, 1}, - {125, 2}, - {128, 3}, - {131, 4}, + {127, 2}, + {130, 3}, + {133, 4}, {12, 5}, - {132, 5}, - {133, 6}, + {134, 5}, + {135, 6}, }; static arc arcs_49_1[2] = { {9, 7}, {18, 5}, }; static arc arcs_49_2[2] = { - {126, 8}, - {127, 5}, + {128, 8}, + {129, 5}, }; static arc arcs_49_3[2] = { - {129, 9}, - {130, 5}, + {131, 9}, + {132, 5}, }; static arc arcs_49_4[1] = { {9, 10}, @@ -1041,20 +1043,20 @@ static arc arcs_49_5[1] = { {0, 5}, }; static arc arcs_49_6[2] = { - {133, 6}, + {135, 6}, {0, 6}, }; static arc arcs_49_7[1] = { {18, 5}, }; static arc arcs_49_8[1] = { - {127, 5}, + {129, 5}, }; static arc arcs_49_9[1] = { - {130, 5}, + {132, 5}, }; static arc arcs_49_10[1] = { - {131, 5}, + {133, 5}, }; static state states_49[11] = { {7, arcs_49_0}, @@ -1073,7 +1075,7 @@ static arc arcs_50_0[1] = { {21, 1}, }; static arc arcs_50_1[3] = { - {134, 2}, + {136, 2}, {22, 3}, {0, 1}, }; @@ -1096,7 +1098,7 @@ static state states_50[5] = { {2, arcs_50_4}, }; static arc arcs_51_0[1] = { - {135, 1}, + {137, 1}, }; static arc arcs_51_1[2] = { {17, 2}, @@ -1120,15 +1122,15 @@ static state states_51[5] = { }; static arc arcs_52_0[3] = { {16, 1}, - {125, 2}, - {69, 3}, + {127, 2}, + {70, 3}, }; static arc arcs_52_1[2] = { - {136, 4}, + {138, 4}, {18, 5}, }; static arc arcs_52_2[1] = { - {137, 6}, + {139, 6}, }; static arc arcs_52_3[1] = { {12, 5}, @@ -1140,7 +1142,7 @@ static arc arcs_52_5[1] = { {0, 5}, }; static arc arcs_52_6[1] = { - {127, 5}, + {129, 5}, }; static state states_52[7] = { {3, arcs_52_0}, @@ -1152,14 +1154,14 @@ static state states_52[7] = { {1, arcs_52_6}, }; static arc arcs_53_0[1] = { - {138, 1}, + {140, 1}, }; static arc arcs_53_1[2] = { {22, 2}, {0, 1}, }; static arc arcs_53_2[2] = { - {138, 1}, + {140, 1}, {0, 2}, }; static state states_53[3] = { @@ -1168,12 +1170,12 @@ static state states_53[3] = { {2, arcs_53_2}, }; static arc arcs_54_0[3] = { - {69, 1}, + {70, 1}, {21, 2}, {14, 3}, }; static arc arcs_54_1[1] = { - {69, 4}, + {70, 4}, }; static arc arcs_54_2[2] = { {14, 3}, @@ -1181,14 +1183,14 @@ static arc arcs_54_2[2] = { }; static arc arcs_54_3[3] = { {21, 5}, - {139, 6}, + {141, 6}, {0, 3}, }; static arc arcs_54_4[1] = { - {69, 6}, + {70, 6}, }; static arc arcs_54_5[2] = { - {139, 6}, + {141, 6}, {0, 5}, }; static arc arcs_54_6[1] = { @@ -1219,14 +1221,14 @@ static state states_55[3] = { {1, arcs_55_2}, }; static arc arcs_56_0[1] = { - {72, 1}, + {73, 1}, }; static arc arcs_56_1[2] = { {22, 2}, {0, 1}, }; static arc arcs_56_2[2] = { - {72, 1}, + {73, 1}, {0, 2}, }; static state states_56[3] = { @@ -1275,7 +1277,7 @@ static state states_58[5] = { {2, arcs_58_4}, }; static arc arcs_59_0[1] = { - {140, 1}, + {142, 1}, }; static arc arcs_59_1[1] = { {12, 2}, @@ -1310,7 +1312,7 @@ static state states_59[8] = { {1, arcs_59_7}, }; static arc arcs_60_0[3] = { - {141, 1}, + {143, 1}, {23, 2}, {24, 3}, }; @@ -1325,7 +1327,7 @@ static arc arcs_60_3[1] = { {21, 6}, }; static arc arcs_60_4[4] = { - {141, 1}, + {143, 1}, {23, 2}, {24, 3}, {0, 4}, @@ -1370,8 +1372,8 @@ static state states_61[4] = { {1, arcs_61_3}, }; static arc arcs_62_0[2] = { - {134, 1}, - {143, 1}, + {136, 1}, + {145, 1}, }; static arc arcs_62_1[1] = { {0, 1}, @@ -1381,19 +1383,19 @@ static state states_62[2] = { {1, arcs_62_1}, }; static arc arcs_63_0[1] = { - {84, 1}, + {85, 1}, }; static arc arcs_63_1[1] = { - {52, 2}, + {53, 2}, }; static arc arcs_63_2[1] = { - {73, 3}, + {74, 3}, }; static arc arcs_63_3[1] = { {9, 4}, }; static arc arcs_63_4[2] = { - {142, 5}, + {144, 5}, {0, 4}, }; static arc arcs_63_5[1] = { @@ -1408,13 +1410,13 @@ static state states_63[6] = { {1, arcs_63_5}, }; static arc arcs_64_0[1] = { - {80, 1}, + {81, 1}, }; static arc arcs_64_1[1] = { {21, 2}, }; static arc arcs_64_2[2] = { - {142, 3}, + {144, 3}, {0, 2}, }; static arc arcs_64_3[1] = { @@ -1428,137 +1430,137 @@ static state states_64[4] = { }; static dfa dfas[65] = { {256, "single_input", 0, 3, states_0, - "\004\030\001\000\000\000\052\370\305\004\071\000\001\000\060\042\271\020"}, + "\004\030\001\000\000\000\124\360\213\011\162\000\002\000\140\210\344\102\000"}, {257, "file_input", 0, 2, states_1, - "\204\030\001\000\000\000\052\370\305\004\071\000\001\000\060\042\271\020"}, + "\204\030\001\000\000\000\124\360\213\011\162\000\002\000\140\210\344\102\000"}, {258, "eval_input", 0, 3, states_2, - "\000\020\001\000\000\000\000\000\000\000\000\000\001\000\060\042\271\000"}, + "\000\020\001\000\000\000\000\000\000\000\000\000\002\000\140\210\344\002\000"}, {259, "funcdef", 0, 6, states_3, - "\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {260, "parameters", 0, 4, states_4, - "\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {261, "varargslist", 0, 10, states_5, - "\000\020\201\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\020\201\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {262, "fpdef", 0, 4, states_6, - "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {263, "fplist", 0, 3, states_7, - "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {264, "stmt", 0, 2, states_8, - "\000\030\001\000\000\000\052\370\305\004\071\000\001\000\060\042\271\020"}, + "\000\030\001\000\000\000\124\360\213\011\162\000\002\000\140\210\344\102\000"}, {265, "simple_stmt", 0, 4, states_9, - "\000\020\001\000\000\000\052\370\305\004\000\000\001\000\060\042\271\000"}, + "\000\020\001\000\000\000\124\360\213\011\000\000\002\000\140\210\344\002\000"}, {266, "small_stmt", 0, 2, states_10, - "\000\020\001\000\000\000\052\370\305\004\000\000\001\000\060\042\271\000"}, + "\000\020\001\000\000\000\124\360\213\011\000\000\002\000\140\210\344\002\000"}, {267, "expr_stmt", 0, 6, states_11, - "\000\020\001\000\000\000\000\000\000\000\000\000\001\000\060\042\271\000"}, + "\000\020\001\000\000\000\000\000\000\000\000\000\002\000\140\210\344\002\000"}, {268, "augassign", 0, 2, states_12, - "\000\000\000\000\300\377\001\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\300\377\003\000\000\000\000\000\000\000\000\000\000\000\000"}, {269, "print_stmt", 0, 9, states_13, - "\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000"}, {270, "del_stmt", 0, 3, states_14, - "\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000"}, {271, "pass_stmt", 0, 2, states_15, - "\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000"}, {272, "flow_stmt", 0, 2, states_16, - "\000\000\000\000\000\000\000\370\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\360\001\000\000\000\000\000\000\000\000\000\000"}, {273, "break_stmt", 0, 2, states_17, - "\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000"}, {274, "continue_stmt", 0, 2, states_18, - "\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000"}, {275, "return_stmt", 0, 3, states_19, - "\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000"}, {276, "yield_stmt", 0, 3, states_20, - "\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000"}, {277, "raise_stmt", 0, 7, states_21, - "\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000"}, {278, "import_stmt", 0, 9, states_22, - "\000\000\000\000\000\000\000\000\005\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\000"}, {279, "import_as_name", 0, 4, states_23, - "\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {280, "dotted_as_name", 0, 4, states_24, - "\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {281, "dotted_name", 0, 2, states_25, - "\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {282, "global_stmt", 0, 3, states_26, - "\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000"}, {283, "exec_stmt", 0, 7, states_27, - "\000\000\000\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000"}, {284, "assert_stmt", 0, 5, states_28, - "\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000"}, {285, "compound_stmt", 0, 2, states_29, - "\000\010\000\000\000\000\000\000\000\000\071\000\000\000\000\000\000\020"}, + "\000\010\000\000\000\000\000\000\000\000\162\000\000\000\000\000\000\100\000"}, {286, "if_stmt", 0, 8, states_30, - "\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000"}, {287, "while_stmt", 0, 8, states_31, - "\000\000\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000"}, {288, "for_stmt", 0, 10, states_32, - "\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000"}, {289, "try_stmt", 0, 10, states_33, - "\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000"}, {290, "except_clause", 0, 5, states_34, - "\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000"}, {291, "suite", 0, 5, states_35, - "\004\020\001\000\000\000\052\370\305\004\000\000\001\000\060\042\271\000"}, + "\004\020\001\000\000\000\124\360\213\011\000\000\002\000\140\210\344\002\000"}, {292, "test", 0, 4, states_36, - "\000\020\001\000\000\000\000\000\000\000\000\000\001\000\060\042\271\000"}, + "\000\020\001\000\000\000\000\000\000\000\000\000\002\000\140\210\344\002\000"}, {293, "and_test", 0, 2, states_37, - "\000\020\001\000\000\000\000\000\000\000\000\000\001\000\060\042\071\000"}, + "\000\020\001\000\000\000\000\000\000\000\000\000\002\000\140\210\344\000\000"}, {294, "not_test", 0, 3, states_38, - "\000\020\001\000\000\000\000\000\000\000\000\000\001\000\060\042\071\000"}, + "\000\020\001\000\000\000\000\000\000\000\000\000\002\000\140\210\344\000\000"}, {295, "comparison", 0, 2, states_39, - "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\060\042\071\000"}, + "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\140\210\344\000\000"}, {296, "comp_op", 0, 4, states_40, - "\000\000\000\000\000\000\000\000\000\002\000\000\371\007\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\004\000\000\362\017\000\000\000\000\000"}, {297, "expr", 0, 2, states_41, - "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\060\042\071\000"}, + "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\140\210\344\000\000"}, {298, "xor_expr", 0, 2, states_42, - "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\060\042\071\000"}, + "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\140\210\344\000\000"}, {299, "and_expr", 0, 2, states_43, - "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\060\042\071\000"}, + "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\140\210\344\000\000"}, {300, "shift_expr", 0, 2, states_44, - "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\060\042\071\000"}, + "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\140\210\344\000\000"}, {301, "arith_expr", 0, 2, states_45, - "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\060\042\071\000"}, + "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\140\210\344\000\000"}, {302, "term", 0, 2, states_46, - "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\060\042\071\000"}, + "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\140\210\344\000\000"}, {303, "factor", 0, 3, states_47, - "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\060\042\071\000"}, + "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\140\210\344\000\000"}, {304, "power", 0, 4, states_48, - "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\000\040\071\000"}, + "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\000\200\344\000\000"}, {305, "atom", 0, 11, states_49, - "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\000\040\071\000"}, + "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\000\200\344\000\000"}, {306, "listmaker", 0, 5, states_50, - "\000\020\001\000\000\000\000\000\000\000\000\000\001\000\060\042\271\000"}, + "\000\020\001\000\000\000\000\000\000\000\000\000\002\000\140\210\344\002\000"}, {307, "lambdef", 0, 5, states_51, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200\000"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000"}, {308, "trailer", 0, 7, states_52, - "\000\000\001\000\000\000\000\000\040\000\000\000\000\000\000\040\000\000"}, + "\000\000\001\000\000\000\000\000\100\000\000\000\000\000\000\200\000\000\000"}, {309, "subscriptlist", 0, 3, states_53, - "\000\120\001\000\000\000\000\000\040\000\000\000\001\000\060\042\271\000"}, + "\000\120\001\000\000\000\000\000\100\000\000\000\002\000\140\210\344\002\000"}, {310, "subscript", 0, 7, states_54, - "\000\120\001\000\000\000\000\000\040\000\000\000\001\000\060\042\271\000"}, + "\000\120\001\000\000\000\000\000\100\000\000\000\002\000\140\210\344\002\000"}, {311, "sliceop", 0, 3, states_55, - "\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, + "\000\100\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {312, "exprlist", 0, 3, states_56, - "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\060\042\071\000"}, + "\000\020\001\000\000\000\000\000\000\000\000\000\000\000\140\210\344\000\000"}, {313, "testlist", 0, 3, states_57, - "\000\020\001\000\000\000\000\000\000\000\000\000\001\000\060\042\271\000"}, + "\000\020\001\000\000\000\000\000\000\000\000\000\002\000\140\210\344\002\000"}, {314, "dictmaker", 0, 5, states_58, - "\000\020\001\000\000\000\000\000\000\000\000\000\001\000\060\042\271\000"}, + "\000\020\001\000\000\000\000\000\000\000\000\000\002\000\140\210\344\002\000"}, {315, "classdef", 0, 8, states_59, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\020"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\100\000"}, {316, "arglist", 0, 8, states_60, - "\000\020\201\001\000\000\000\000\000\000\000\000\001\000\060\042\271\000"}, + "\000\020\201\001\000\000\000\000\000\000\000\000\002\000\140\210\344\002\000"}, {317, "argument", 0, 4, states_61, - "\000\020\001\000\000\000\000\000\000\000\000\000\001\000\060\042\271\000"}, + "\000\020\001\000\000\000\000\000\000\000\000\000\002\000\140\210\344\002\000"}, {318, "list_iter", 0, 2, states_62, - "\000\000\000\000\000\000\000\000\000\000\021\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\042\000\000\000\000\000\000\000\000"}, {319, "list_for", 0, 6, states_63, - "\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000"}, {320, "list_if", 0, 4, states_64, - "\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000"}, + "\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000"}, }; -static label labels[144] = { +static label labels[146] = { {0, "EMPTY"}, {256, 0}, {4, 0}, @@ -1608,6 +1610,7 @@ static label labels[144] = { {45, 0}, {46, 0}, {47, 0}, + {49, 0}, {1, "print"}, {35, 0}, {1, "del"}, @@ -1680,6 +1683,7 @@ static label labels[144] = { {303, 0}, {17, 0}, {24, 0}, + {48, 0}, {32, 0}, {304, 0}, {305, 0}, @@ -1707,6 +1711,6 @@ static label labels[144] = { grammar _PyParser_Grammar = { 65, dfas, - {144, labels}, + {146, labels}, 256 }; |