Index: Python/graminit.c =================================================================== --- Python/graminit.c (revision 70295) +++ Python/graminit.c (working copy) @@ -1186,18 +1186,26 @@ {127, 1}, }; static arc arcs_56_1[2] = { - {128, 0}, + {23, 2}, {0, 1}, }; -static state states_56[2] = { +static arc arcs_56_2[1] = { + {127, 3}, +}; +static arc arcs_56_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 arc arcs_57_0[1] = { - {129, 1}, + {128, 1}, }; static arc arcs_57_1[2] = { - {130, 0}, + {129, 0}, {0, 1}, }; static state states_57[2] = { @@ -1205,23 +1213,22 @@ {2, arcs_57_1}, }; static arc arcs_58_0[1] = { - {131, 1}, + {130, 1}, }; -static arc arcs_58_1[3] = { - {132, 0}, - {133, 0}, +static arc arcs_58_1[2] = { + {131, 0}, {0, 1}, }; static state states_58[2] = { {1, arcs_58_0}, - {3, arcs_58_1}, + {2, arcs_58_1}, }; static arc arcs_59_0[1] = { - {134, 1}, + {132, 1}, }; static arc arcs_59_1[3] = { - {135, 0}, - {136, 0}, + {133, 0}, + {134, 0}, {0, 1}, }; static state states_59[2] = { @@ -1229,250 +1236,246 @@ {3, arcs_59_1}, }; static arc arcs_60_0[1] = { - {137, 1}, + {135, 1}, }; -static arc arcs_60_1[5] = { +static arc arcs_60_1[3] = { + {136, 0}, + {137, 0}, + {0, 1}, +}; +static state states_60[2] = { + {1, arcs_60_0}, + {3, arcs_60_1}, +}; +static arc arcs_61_0[1] = { + {138, 1}, +}; +static arc arcs_61_1[5] = { {31, 0}, - {138, 0}, {139, 0}, {140, 0}, + {141, 0}, {0, 1}, }; -static state states_60[2] = { - {1, arcs_60_0}, - {5, arcs_60_1}, +static state states_61[2] = { + {1, arcs_61_0}, + {5, arcs_61_1}, }; -static arc arcs_61_0[4] = { - {135, 1}, +static arc arcs_62_0[4] = { {136, 1}, - {141, 1}, - {142, 2}, + {137, 1}, + {142, 1}, + {143, 2}, }; -static arc arcs_61_1[1] = { - {137, 2}, +static arc arcs_62_1[1] = { + {138, 2}, }; -static arc arcs_61_2[1] = { +static arc arcs_62_2[1] = { {0, 2}, }; -static state states_61[3] = { - {4, arcs_61_0}, - {1, arcs_61_1}, - {1, arcs_61_2}, +static state states_62[3] = { + {4, arcs_62_0}, + {1, arcs_62_1}, + {1, arcs_62_2}, }; -static arc arcs_62_0[1] = { - {143, 1}, +static arc arcs_63_0[1] = { + {144, 1}, }; -static arc arcs_62_1[3] = { - {144, 1}, +static arc arcs_63_1[3] = { + {145, 1}, {32, 2}, {0, 1}, }; -static arc arcs_62_2[1] = { - {137, 3}, +static arc arcs_63_2[1] = { + {138, 3}, }; -static arc arcs_62_3[1] = { +static arc arcs_63_3[1] = { {0, 3}, }; -static state states_62[4] = { - {1, arcs_62_0}, - {3, arcs_62_1}, - {1, arcs_62_2}, - {1, arcs_62_3}, +static state states_63[4] = { + {1, arcs_63_0}, + {3, arcs_63_1}, + {1, arcs_63_2}, + {1, arcs_63_3}, }; -static arc arcs_63_0[10] = { +static arc arcs_64_0[10] = { {13, 1}, - {146, 2}, - {148, 3}, + {147, 2}, + {149, 3}, {21, 4}, - {151, 4}, - {152, 5}, + {152, 4}, + {153, 5}, {77, 4}, - {153, 4}, {154, 4}, {155, 4}, + {156, 4}, }; -static arc arcs_63_1[3] = { +static arc arcs_64_1[3] = { {46, 6}, - {145, 6}, + {146, 6}, {15, 4}, }; -static arc arcs_63_2[2] = { - {145, 7}, - {147, 4}, +static arc arcs_64_2[2] = { + {146, 7}, + {148, 4}, }; -static arc arcs_63_3[2] = { - {149, 8}, - {150, 4}, +static arc arcs_64_3[2] = { + {150, 8}, + {151, 4}, }; -static arc arcs_63_4[1] = { +static arc arcs_64_4[1] = { {0, 4}, }; -static arc arcs_63_5[2] = { - {152, 5}, +static arc arcs_64_5[2] = { + {153, 5}, {0, 5}, }; -static arc arcs_63_6[1] = { +static arc arcs_64_6[1] = { {15, 4}, }; -static arc arcs_63_7[1] = { - {147, 4}, +static arc arcs_64_7[1] = { + {148, 4}, }; -static arc arcs_63_8[1] = { - {150, 4}, +static arc arcs_64_8[1] = { + {151, 4}, }; -static state states_63[9] = { - {10, arcs_63_0}, - {3, arcs_63_1}, - {2, arcs_63_2}, - {2, arcs_63_3}, - {1, arcs_63_4}, - {2, arcs_63_5}, - {1, arcs_63_6}, - {1, arcs_63_7}, - {1, arcs_63_8}, +static state states_64[9] = { + {10, arcs_64_0}, + {3, arcs_64_1}, + {2, arcs_64_2}, + {2, arcs_64_3}, + {1, arcs_64_4}, + {2, arcs_64_5}, + {1, arcs_64_6}, + {1, arcs_64_7}, + {1, arcs_64_8}, }; -static arc arcs_64_0[1] = { +static arc arcs_65_0[1] = { {24, 1}, }; -static arc arcs_64_1[3] = { - {156, 2}, +static arc arcs_65_1[3] = { + {157, 2}, {30, 3}, {0, 1}, }; -static arc arcs_64_2[1] = { +static arc arcs_65_2[1] = { {0, 2}, }; -static arc arcs_64_3[2] = { +static arc arcs_65_3[2] = { {24, 4}, {0, 3}, }; -static arc arcs_64_4[2] = { +static arc arcs_65_4[2] = { {30, 3}, {0, 4}, }; -static state states_64[5] = { - {1, arcs_64_0}, - {3, arcs_64_1}, - {1, arcs_64_2}, - {2, arcs_64_3}, - {2, arcs_64_4}, +static state states_65[5] = { + {1, arcs_65_0}, + {3, arcs_65_1}, + {1, arcs_65_2}, + {2, arcs_65_3}, + {2, arcs_65_4}, }; -static arc arcs_65_0[3] = { +static arc arcs_66_0[3] = { {13, 1}, - {146, 2}, + {147, 2}, {76, 3}, }; -static arc arcs_65_1[2] = { +static arc arcs_66_1[2] = { {14, 4}, {15, 5}, }; -static arc arcs_65_2[1] = { - {157, 6}, +static arc arcs_66_2[1] = { + {158, 6}, }; -static arc arcs_65_3[1] = { +static arc arcs_66_3[1] = { {21, 5}, }; -static arc arcs_65_4[1] = { +static arc arcs_66_4[1] = { {15, 5}, }; -static arc arcs_65_5[1] = { +static arc arcs_66_5[1] = { {0, 5}, }; -static arc arcs_65_6[1] = { - {147, 5}, +static arc arcs_66_6[1] = { + {148, 5}, }; -static state states_65[7] = { - {3, arcs_65_0}, - {2, arcs_65_1}, - {1, arcs_65_2}, - {1, arcs_65_3}, - {1, arcs_65_4}, - {1, arcs_65_5}, - {1, arcs_65_6}, +static state states_66[7] = { + {3, arcs_66_0}, + {2, arcs_66_1}, + {1, arcs_66_2}, + {1, arcs_66_3}, + {1, arcs_66_4}, + {1, arcs_66_5}, + {1, arcs_66_6}, }; -static arc arcs_66_0[1] = { - {158, 1}, +static arc arcs_67_0[1] = { + {159, 1}, }; -static arc arcs_66_1[2] = { +static arc arcs_67_1[2] = { {30, 2}, {0, 1}, }; -static arc arcs_66_2[2] = { - {158, 1}, +static arc arcs_67_2[2] = { + {159, 1}, {0, 2}, }; -static state states_66[3] = { - {1, arcs_66_0}, - {2, arcs_66_1}, - {2, arcs_66_2}, +static state states_67[3] = { + {1, arcs_67_0}, + {2, arcs_67_1}, + {2, arcs_67_2}, }; -static arc arcs_67_0[2] = { +static arc arcs_68_0[2] = { {24, 1}, {25, 2}, }; -static arc arcs_67_1[2] = { +static arc arcs_68_1[2] = { {25, 2}, {0, 1}, }; -static arc arcs_67_2[3] = { +static arc arcs_68_2[3] = { {24, 3}, - {159, 4}, + {160, 4}, {0, 2}, }; -static arc arcs_67_3[2] = { - {159, 4}, +static arc arcs_68_3[2] = { + {160, 4}, {0, 3}, }; -static arc arcs_67_4[1] = { +static arc arcs_68_4[1] = { {0, 4}, }; -static state states_67[5] = { - {2, arcs_67_0}, - {2, arcs_67_1}, - {3, arcs_67_2}, - {2, arcs_67_3}, - {1, arcs_67_4}, -}; -static arc arcs_68_0[1] = { - {25, 1}, -}; -static arc arcs_68_1[2] = { - {24, 2}, - {0, 1}, -}; -static arc arcs_68_2[1] = { - {0, 2}, -}; -static state states_68[3] = { - {1, arcs_68_0}, +static state states_68[5] = { + {2, arcs_68_0}, {2, arcs_68_1}, - {1, arcs_68_2}, + {3, arcs_68_2}, + {2, arcs_68_3}, + {1, arcs_68_4}, }; static arc arcs_69_0[1] = { - {116, 1}, + {25, 1}, }; static arc arcs_69_1[2] = { - {30, 2}, + {24, 2}, {0, 1}, }; -static arc arcs_69_2[2] = { - {116, 1}, +static arc arcs_69_2[1] = { {0, 2}, }; static state states_69[3] = { {1, arcs_69_0}, {2, arcs_69_1}, - {2, arcs_69_2}, + {1, arcs_69_2}, }; static arc arcs_70_0[1] = { - {24, 1}, + {116, 1}, }; static arc arcs_70_1[2] = { {30, 2}, {0, 1}, }; static arc arcs_70_2[2] = { - {24, 1}, + {116, 1}, {0, 2}, }; static state states_70[3] = { @@ -1483,256 +1486,272 @@ static arc arcs_71_0[1] = { {24, 1}, }; -static arc arcs_71_1[4] = { +static arc arcs_71_1[2] = { + {30, 2}, + {0, 1}, +}; +static arc arcs_71_2[2] = { + {24, 1}, + {0, 2}, +}; +static state states_71[3] = { + {1, arcs_71_0}, + {2, arcs_71_1}, + {2, arcs_71_2}, +}; +static arc arcs_72_0[1] = { + {24, 1}, +}; +static arc arcs_72_1[4] = { {25, 2}, - {156, 3}, + {157, 3}, {30, 4}, {0, 1}, }; -static arc arcs_71_2[1] = { +static arc arcs_72_2[1] = { {24, 5}, }; -static arc arcs_71_3[1] = { +static arc arcs_72_3[1] = { {0, 3}, }; -static arc arcs_71_4[2] = { +static arc arcs_72_4[2] = { {24, 6}, {0, 4}, }; -static arc arcs_71_5[3] = { - {156, 3}, +static arc arcs_72_5[3] = { + {157, 3}, {30, 7}, {0, 5}, }; -static arc arcs_71_6[2] = { +static arc arcs_72_6[2] = { {30, 4}, {0, 6}, }; -static arc arcs_71_7[2] = { +static arc arcs_72_7[2] = { {24, 8}, {0, 7}, }; -static arc arcs_71_8[1] = { +static arc arcs_72_8[1] = { {25, 9}, }; -static arc arcs_71_9[1] = { +static arc arcs_72_9[1] = { {24, 10}, }; -static arc arcs_71_10[2] = { +static arc arcs_72_10[2] = { {30, 7}, {0, 10}, }; -static state states_71[11] = { - {1, arcs_71_0}, - {4, arcs_71_1}, - {1, arcs_71_2}, - {1, arcs_71_3}, - {2, arcs_71_4}, - {3, arcs_71_5}, - {2, arcs_71_6}, - {2, arcs_71_7}, - {1, arcs_71_8}, - {1, arcs_71_9}, - {2, arcs_71_10}, +static state states_72[11] = { + {1, arcs_72_0}, + {4, arcs_72_1}, + {1, arcs_72_2}, + {1, arcs_72_3}, + {2, arcs_72_4}, + {3, arcs_72_5}, + {2, arcs_72_6}, + {2, arcs_72_7}, + {1, arcs_72_8}, + {1, arcs_72_9}, + {2, arcs_72_10}, }; -static arc arcs_72_0[1] = { - {160, 1}, +static arc arcs_73_0[1] = { + {161, 1}, }; -static arc arcs_72_1[1] = { +static arc arcs_73_1[1] = { {21, 2}, }; -static arc arcs_72_2[2] = { +static arc arcs_73_2[2] = { {13, 3}, {25, 4}, }; -static arc arcs_72_3[2] = { +static arc arcs_73_3[2] = { {14, 5}, {15, 6}, }; -static arc arcs_72_4[1] = { +static arc arcs_73_4[1] = { {26, 7}, }; -static arc arcs_72_5[1] = { +static arc arcs_73_5[1] = { {15, 6}, }; -static arc arcs_72_6[1] = { +static arc arcs_73_6[1] = { {25, 4}, }; -static arc arcs_72_7[1] = { +static arc arcs_73_7[1] = { {0, 7}, }; -static state states_72[8] = { - {1, arcs_72_0}, - {1, arcs_72_1}, - {2, arcs_72_2}, - {2, arcs_72_3}, - {1, arcs_72_4}, - {1, arcs_72_5}, - {1, arcs_72_6}, - {1, arcs_72_7}, +static state states_73[8] = { + {1, arcs_73_0}, + {1, arcs_73_1}, + {2, arcs_73_2}, + {2, arcs_73_3}, + {1, arcs_73_4}, + {1, arcs_73_5}, + {1, arcs_73_6}, + {1, arcs_73_7}, }; -static arc arcs_73_0[3] = { - {161, 1}, +static arc arcs_74_0[3] = { + {162, 1}, {31, 2}, {32, 3}, }; -static arc arcs_73_1[2] = { +static arc arcs_74_1[2] = { {30, 4}, {0, 1}, }; -static arc arcs_73_2[1] = { +static arc arcs_74_2[1] = { {24, 5}, }; -static arc arcs_73_3[1] = { +static arc arcs_74_3[1] = { {24, 6}, }; -static arc arcs_73_4[4] = { - {161, 1}, +static arc arcs_74_4[4] = { + {162, 1}, {31, 2}, {32, 3}, {0, 4}, }; -static arc arcs_73_5[2] = { +static arc arcs_74_5[2] = { {30, 7}, {0, 5}, }; -static arc arcs_73_6[1] = { +static arc arcs_74_6[1] = { {0, 6}, }; -static arc arcs_73_7[2] = { - {161, 5}, +static arc arcs_74_7[2] = { + {162, 5}, {32, 3}, }; -static state states_73[8] = { - {3, arcs_73_0}, - {2, arcs_73_1}, - {1, arcs_73_2}, - {1, arcs_73_3}, - {4, arcs_73_4}, - {2, arcs_73_5}, - {1, arcs_73_6}, - {2, arcs_73_7}, +static state states_74[8] = { + {3, arcs_74_0}, + {2, arcs_74_1}, + {1, arcs_74_2}, + {1, arcs_74_3}, + {4, arcs_74_4}, + {2, arcs_74_5}, + {1, arcs_74_6}, + {2, arcs_74_7}, }; -static arc arcs_74_0[1] = { +static arc arcs_75_0[1] = { {24, 1}, }; -static arc arcs_74_1[3] = { - {156, 2}, +static arc arcs_75_1[3] = { + {157, 2}, {29, 3}, {0, 1}, }; -static arc arcs_74_2[1] = { +static arc arcs_75_2[1] = { {0, 2}, }; -static arc arcs_74_3[1] = { +static arc arcs_75_3[1] = { {24, 2}, }; -static state states_74[4] = { - {1, arcs_74_0}, - {3, arcs_74_1}, - {1, arcs_74_2}, - {1, arcs_74_3}, +static state states_75[4] = { + {1, arcs_75_0}, + {3, arcs_75_1}, + {1, arcs_75_2}, + {1, arcs_75_3}, }; -static arc arcs_75_0[2] = { - {156, 1}, - {163, 1}, +static arc arcs_76_0[2] = { + {157, 1}, + {164, 1}, }; -static arc arcs_75_1[1] = { +static arc arcs_76_1[1] = { {0, 1}, }; -static state states_75[2] = { - {2, arcs_75_0}, - {1, arcs_75_1}, +static state states_76[2] = { + {2, arcs_76_0}, + {1, arcs_76_1}, }; -static arc arcs_76_0[1] = { +static arc arcs_77_0[1] = { {94, 1}, }; -static arc arcs_76_1[1] = { +static arc arcs_77_1[1] = { {60, 2}, }; -static arc arcs_76_2[1] = { +static arc arcs_77_2[1] = { {95, 3}, }; -static arc arcs_76_3[1] = { +static arc arcs_77_3[1] = { {105, 4}, }; -static arc arcs_76_4[2] = { - {162, 5}, +static arc arcs_77_4[2] = { + {163, 5}, {0, 4}, }; -static arc arcs_76_5[1] = { +static arc arcs_77_5[1] = { {0, 5}, }; -static state states_76[6] = { - {1, arcs_76_0}, - {1, arcs_76_1}, - {1, arcs_76_2}, - {1, arcs_76_3}, - {2, arcs_76_4}, - {1, arcs_76_5}, +static state states_77[6] = { + {1, arcs_77_0}, + {1, arcs_77_1}, + {1, arcs_77_2}, + {1, arcs_77_3}, + {2, arcs_77_4}, + {1, arcs_77_5}, }; -static arc arcs_77_0[1] = { +static arc arcs_78_0[1] = { {90, 1}, }; -static arc arcs_77_1[1] = { +static arc arcs_78_1[1] = { {107, 2}, }; -static arc arcs_77_2[2] = { - {162, 3}, +static arc arcs_78_2[2] = { + {163, 3}, {0, 2}, }; -static arc arcs_77_3[1] = { +static arc arcs_78_3[1] = { {0, 3}, }; -static state states_77[4] = { - {1, arcs_77_0}, - {1, arcs_77_1}, - {2, arcs_77_2}, - {1, arcs_77_3}, +static state states_78[4] = { + {1, arcs_78_0}, + {1, arcs_78_1}, + {2, arcs_78_2}, + {1, arcs_78_3}, }; -static arc arcs_78_0[1] = { +static arc arcs_79_0[1] = { {24, 1}, }; -static arc arcs_78_1[2] = { +static arc arcs_79_1[2] = { {30, 0}, {0, 1}, }; -static state states_78[2] = { - {1, arcs_78_0}, - {2, arcs_78_1}, +static state states_79[2] = { + {1, arcs_79_0}, + {2, arcs_79_1}, }; -static arc arcs_79_0[1] = { +static arc arcs_80_0[1] = { {21, 1}, }; -static arc arcs_79_1[1] = { +static arc arcs_80_1[1] = { {0, 1}, }; -static state states_79[2] = { - {1, arcs_79_0}, - {1, arcs_79_1}, +static state states_80[2] = { + {1, arcs_80_0}, + {1, arcs_80_1}, }; -static arc arcs_80_0[1] = { - {166, 1}, +static arc arcs_81_0[1] = { + {167, 1}, }; -static arc arcs_80_1[2] = { +static arc arcs_81_1[2] = { {9, 2}, {0, 1}, }; -static arc arcs_80_2[1] = { +static arc arcs_81_2[1] = { {0, 2}, }; -static state states_80[3] = { - {1, arcs_80_0}, - {2, arcs_80_1}, - {1, arcs_80_2}, +static state states_81[3] = { + {1, arcs_81_0}, + {2, arcs_81_1}, + {1, arcs_81_2}, }; -static dfa dfas[81] = { +static dfa dfas[82] = { {256, "single_input", 0, 3, states_0, - "\004\050\060\200\000\000\000\050\370\044\034\144\011\040\004\000\200\041\224\017\101"}, + "\004\050\060\200\000\000\000\050\370\044\034\144\011\040\004\000\000\103\050\037\202"}, {257, "file_input", 0, 2, states_1, - "\204\050\060\200\000\000\000\050\370\044\034\144\011\040\004\000\200\041\224\017\101"}, + "\204\050\060\200\000\000\000\050\370\044\034\144\011\040\004\000\000\103\050\037\202"}, {258, "eval_input", 0, 3, states_2, - "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"}, + "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\000\103\050\037\000"}, {259, "decorator", 0, 7, states_3, "\000\010\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {260, "decorators", 0, 2, states_4, @@ -1752,13 +1771,13 @@ {267, "vfpdef", 0, 2, states_11, "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {268, "stmt", 0, 2, states_12, - "\000\050\060\200\000\000\000\050\370\044\034\144\011\040\004\000\200\041\224\017\101"}, + "\000\050\060\200\000\000\000\050\370\044\034\144\011\040\004\000\000\103\050\037\202"}, {269, "simple_stmt", 0, 4, states_13, - "\000\040\040\200\000\000\000\050\370\044\034\000\000\040\004\000\200\041\224\017\100"}, + "\000\040\040\200\000\000\000\050\370\044\034\000\000\040\004\000\000\103\050\037\200"}, {270, "small_stmt", 0, 2, states_14, - "\000\040\040\200\000\000\000\050\370\044\034\000\000\040\004\000\200\041\224\017\100"}, + "\000\040\040\200\000\000\000\050\370\044\034\000\000\040\004\000\000\103\050\037\200"}, {271, "expr_stmt", 0, 6, states_15, - "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"}, + "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\000\103\050\037\000"}, {272, "augassign", 0, 2, states_16, "\000\000\000\000\000\200\377\007\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {273, "del_stmt", 0, 3, states_17, @@ -1766,7 +1785,7 @@ {274, "pass_stmt", 0, 2, states_18, "\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000"}, {275, "flow_stmt", 0, 2, states_19, - "\000\000\000\000\000\000\000\000\170\000\000\000\000\000\000\000\000\000\000\000\100"}, + "\000\000\000\000\000\000\000\000\170\000\000\000\000\000\000\000\000\000\000\000\200"}, {276, "break_stmt", 0, 2, states_20, "\000\000\000\000\000\000\000\000\010\000\000\000\000\000\000\000\000\000\000\000\000"}, {277, "continue_stmt", 0, 2, states_21, @@ -1774,7 +1793,7 @@ {278, "return_stmt", 0, 3, states_22, "\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000"}, {279, "yield_stmt", 0, 2, states_23, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\100"}, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200"}, {280, "raise_stmt", 0, 5, states_24, "\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000\000\000\000"}, {281, "import_stmt", 0, 2, states_25, @@ -1800,7 +1819,7 @@ {291, "assert_stmt", 0, 5, states_35, "\000\000\000\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000"}, {292, "compound_stmt", 0, 2, states_36, - "\000\010\020\000\000\000\000\000\000\000\000\144\011\000\000\000\000\000\000\000\001"}, + "\000\010\020\000\000\000\000\000\000\000\000\144\011\000\000\000\000\000\000\000\002"}, {293, "if_stmt", 0, 8, states_37, "\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000"}, {294, "while_stmt", 0, 8, states_38, @@ -1816,81 +1835,83 @@ {299, "except_clause", 0, 5, states_43, "\000\000\000\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000"}, {300, "suite", 0, 5, states_44, - "\004\040\040\200\000\000\000\050\370\044\034\000\000\040\004\000\200\041\224\017\100"}, + "\004\040\040\200\000\000\000\050\370\044\034\000\000\040\004\000\000\103\050\037\200"}, {301, "test", 0, 6, states_45, - "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"}, + "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\000\103\050\037\000"}, {302, "test_nocond", 0, 2, states_46, - "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"}, + "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\000\103\050\037\000"}, {303, "lambdef", 0, 5, states_47, "\000\000\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000"}, {304, "lambdef_nocond", 0, 5, states_48, "\000\000\000\000\000\000\000\000\000\000\000\000\000\040\000\000\000\000\000\000\000"}, {305, "or_test", 0, 2, states_49, - "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\004\000\200\041\224\017\000"}, + "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\004\000\000\103\050\037\000"}, {306, "and_test", 0, 2, states_50, - "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\004\000\200\041\224\017\000"}, + "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\004\000\000\103\050\037\000"}, {307, "not_test", 0, 3, states_51, - "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\004\000\200\041\224\017\000"}, + "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\004\000\000\103\050\037\000"}, {308, "comparison", 0, 2, states_52, - "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\017\000"}, + "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\000\000\000\103\050\037\000"}, {309, "comp_op", 0, 4, states_53, "\000\000\000\000\000\000\000\000\000\000\000\200\000\000\304\037\000\000\000\000\000"}, {310, "star_expr", 0, 3, states_54, - "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\017\000"}, + "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\000\000\000\103\050\037\000"}, {311, "expr", 0, 2, states_55, - "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\017\000"}, - {312, "xor_expr", 0, 2, states_56, - "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\017\000"}, - {313, "and_expr", 0, 2, states_57, - "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\017\000"}, - {314, "shift_expr", 0, 2, states_58, - "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\017\000"}, - {315, "arith_expr", 0, 2, states_59, - "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\017\000"}, - {316, "term", 0, 2, states_60, - "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\017\000"}, - {317, "factor", 0, 3, states_61, - "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\017\000"}, - {318, "power", 0, 4, states_62, - "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\224\017\000"}, - {319, "atom", 0, 9, states_63, - "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\224\017\000"}, - {320, "testlist_comp", 0, 5, states_64, - "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"}, - {321, "trailer", 0, 7, states_65, - "\000\040\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\004\000\000"}, - {322, "subscriptlist", 0, 3, states_66, - "\000\040\040\202\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"}, - {323, "subscript", 0, 5, states_67, - "\000\040\040\202\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"}, - {324, "sliceop", 0, 3, states_68, + "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\000\103\050\037\000"}, + {312, "assexp", 0, 4, states_56, + "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\000\103\050\037\000"}, + {313, "xor_expr", 0, 2, states_57, + "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\000\103\050\037\000"}, + {314, "and_expr", 0, 2, states_58, + "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\000\103\050\037\000"}, + {315, "shift_expr", 0, 2, states_59, + "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\000\103\050\037\000"}, + {316, "arith_expr", 0, 2, states_60, + "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\000\103\050\037\000"}, + {317, "term", 0, 2, states_61, + "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\000\103\050\037\000"}, + {318, "factor", 0, 3, states_62, + "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\000\103\050\037\000"}, + {319, "power", 0, 4, states_63, + "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\050\037\000"}, + {320, "atom", 0, 9, states_64, + "\000\040\040\000\000\000\000\000\000\040\000\000\000\000\000\000\000\000\050\037\000"}, + {321, "testlist_comp", 0, 5, states_65, + "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\000\103\050\037\000"}, + {322, "trailer", 0, 7, states_66, + "\000\040\000\000\000\000\000\000\000\020\000\000\000\000\000\000\000\000\010\000\000"}, + {323, "subscriptlist", 0, 3, states_67, + "\000\040\040\202\000\000\000\000\000\040\000\000\000\040\004\000\000\103\050\037\000"}, + {324, "subscript", 0, 5, states_68, + "\000\040\040\202\000\000\000\000\000\040\000\000\000\040\004\000\000\103\050\037\000"}, + {325, "sliceop", 0, 3, states_69, "\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {325, "exprlist", 0, 3, states_69, - "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\000\000\200\041\224\017\000"}, - {326, "testlist", 0, 3, states_70, - "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"}, - {327, "dictorsetmaker", 0, 11, states_71, - "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"}, - {328, "classdef", 0, 8, states_72, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001"}, - {329, "arglist", 0, 8, states_73, - "\000\040\040\200\001\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"}, - {330, "argument", 0, 4, states_74, - "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"}, - {331, "comp_iter", 0, 2, states_75, + {326, "exprlist", 0, 3, states_70, + "\000\040\040\200\000\000\000\000\000\040\000\000\000\000\000\000\000\103\050\037\000"}, + {327, "testlist", 0, 3, states_71, + "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\000\103\050\037\000"}, + {328, "dictorsetmaker", 0, 11, states_72, + "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\000\103\050\037\000"}, + {329, "classdef", 0, 8, states_73, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002"}, + {330, "arglist", 0, 8, states_74, + "\000\040\040\200\001\000\000\000\000\040\000\000\000\040\004\000\000\103\050\037\000"}, + {331, "argument", 0, 4, states_75, + "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\000\103\050\037\000"}, + {332, "comp_iter", 0, 2, states_76, "\000\000\000\000\000\000\000\000\000\000\000\104\000\000\000\000\000\000\000\000\000"}, - {332, "comp_for", 0, 6, states_76, + {333, "comp_for", 0, 6, states_77, "\000\000\000\000\000\000\000\000\000\000\000\100\000\000\000\000\000\000\000\000\000"}, - {333, "comp_if", 0, 4, states_77, + {334, "comp_if", 0, 4, states_78, "\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000"}, - {334, "testlist1", 0, 2, states_78, - "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\200\041\224\017\000"}, - {335, "encoding_decl", 0, 2, states_79, + {335, "testlist1", 0, 2, states_79, + "\000\040\040\200\000\000\000\000\000\040\000\000\000\040\004\000\000\103\050\037\000"}, + {336, "encoding_decl", 0, 2, states_80, "\000\000\040\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000"}, - {336, "yield_expr", 0, 3, states_80, - "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\100"}, + {337, "yield_expr", 0, 3, states_81, + "\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\200"}, }; -static label labels[167] = { +static label labels[168] = { {0, "EMPTY"}, {256, 0}, {4, 0}, @@ -1900,16 +1921,16 @@ {268, 0}, {0, 0}, {258, 0}, - {326, 0}, + {327, 0}, {259, 0}, {50, 0}, {288, 0}, {7, 0}, - {329, 0}, + {330, 0}, {8, 0}, {260, 0}, {261, 0}, - {328, 0}, + {329, 0}, {262, 0}, {1, "def"}, {1, 0}, @@ -1937,7 +1958,7 @@ {290, 0}, {291, 0}, {272, 0}, - {336, 0}, + {337, 0}, {37, 0}, {38, 0}, {39, 0}, @@ -1951,7 +1972,7 @@ {47, 0}, {49, 0}, {1, "del"}, - {325, 0}, + {326, 0}, {1, "pass"}, {276, 0}, {277, 0}, @@ -2019,49 +2040,50 @@ {312, 0}, {18, 0}, {313, 0}, + {314, 0}, {33, 0}, - {314, 0}, + {315, 0}, {19, 0}, - {315, 0}, + {316, 0}, {34, 0}, {35, 0}, - {316, 0}, + {317, 0}, {14, 0}, {15, 0}, - {317, 0}, + {318, 0}, {17, 0}, {24, 0}, {48, 0}, {32, 0}, - {318, 0}, {319, 0}, + {320, 0}, + {322, 0}, {321, 0}, - {320, 0}, {9, 0}, {10, 0}, {26, 0}, - {327, 0}, + {328, 0}, {27, 0}, {2, 0}, {3, 0}, {1, "None"}, {1, "True"}, {1, "False"}, - {332, 0}, - {322, 0}, + {333, 0}, {323, 0}, {324, 0}, + {325, 0}, {1, "class"}, - {330, 0}, {331, 0}, - {333, 0}, + {332, 0}, {334, 0}, {335, 0}, + {336, 0}, {1, "yield"}, }; grammar _PyParser_Grammar = { - 81, + 82, dfas, - {167, labels}, + {168, labels}, 256 }; Index: Python/ast.c =================================================================== --- Python/ast.c (revision 70295) +++ Python/ast.c (working copy) @@ -1308,7 +1308,31 @@ } +/* assexp: test 'becomes' NAME -> test*/ static expr_ty +ast_for_assexp(struct compiling *c, const node *n) +{ + expr_ty value_expr; + expr_ty asname = NULL; + + REQ(n, assexp); + + value_expr = ast_for_expr(c, CHILD(n, 0)); + if (!value_expr) + return NULL; + + asname = ast_for_expr(c, CHILD(n, 2)); + if (!asname) + return NULL; + + if (!set_context(c, asname, Store, n)) + return NULL; + + return AssExp(value_expr, asname, LINENO(n), n->n_col_offset, + c->c_arena); +} + +static expr_ty ast_for_atom(struct compiling *c, const node *n) { /* atom: '(' [yield_expr|testlist_comp] ')' | '[' [testlist_comp] ']' @@ -1776,7 +1800,8 @@ and_test: not_test ('and' not_test)* not_test: 'not' not_test | comparison comparison: expr (comp_op expr)* - expr: xor_expr ('|' xor_expr)* + expr: assexp ('|' assexp)* + assexp: xor_expr ['->' xor_expr] xor_expr: and_expr ('^' and_expr)* and_expr: shift_expr ('&' shift_expr)* shift_expr: arith_expr (('<<'|'>>') arith_expr)* @@ -1911,6 +1936,12 @@ return ast_for_factor(c, n); case power: return ast_for_power(c, n); + case assexp: + if (NCH(n) == 1) { + n = CHILD(n, 0); + goto loop; + } + return ast_for_assexp(c, n); default: PyErr_Format(PyExc_SystemError, "unhandled expr: %d", TYPE(n)); return NULL; Index: Python/symtable.c =================================================================== --- Python/symtable.c (revision 70295) +++ Python/symtable.c (working copy) @@ -1342,6 +1342,12 @@ case Tuple_kind: VISIT_SEQ(st, expr, e->v.Tuple.elts); break; + case AssExp_kind: + /* inline assignment */ + VISIT(st, expr, e->v.AssExp.value); + if (e->v.AssExp.name) + VISIT(st, expr, e->v.AssExp.name); + break; } return 1; } Index: Python/compile.c =================================================================== --- Python/compile.c (revision 70295) +++ Python/compile.c (working copy) @@ -1707,6 +1707,18 @@ } static int +compiler_assexp(struct compiler *c, expr_ty e) +{ + identifier nameid; + VISIT(c, expr, e->v.AssExp.value); + if (e->v.AssExp.name) { + ADDOP(c, DUP_TOP); + VISIT(c, expr, e->v.AssExp.name); + } + return 1; +} + +static int compiler_if(struct compiler *c, stmt_ty s) { basicblock *end, *next; @@ -3343,6 +3355,8 @@ return compiler_list(c, e); case Tuple_kind: return compiler_tuple(c, e); + case AssExp_kind: + return compiler_assexp(c, e); } return 1; } Index: Python/Python-ast.c =================================================================== --- Python/Python-ast.c (revision 70295) +++ Python/Python-ast.c (working copy) @@ -156,6 +156,11 @@ "op", "values", }; +static PyTypeObject *AssExp_type; +static char *AssExp_fields[]={ + "value", + "name", +}; static PyTypeObject *BinOp_type; static char *BinOp_fields[]={ "left", @@ -712,6 +717,8 @@ if (!add_attributes(expr_type, expr_attributes, 2)) return 0; BoolOp_type = make_type("BoolOp", expr_type, BoolOp_fields, 2); if (!BoolOp_type) return 0; + AssExp_type = make_type("AssExp", expr_type, AssExp_fields, 2); + if (!AssExp_type) return 0; BinOp_type = make_type("BinOp", expr_type, BinOp_fields, 3); if (!BinOp_type) return 0; UnaryOp_type = make_type("UnaryOp", expr_type, UnaryOp_fields, 2); @@ -1457,6 +1464,26 @@ } expr_ty +AssExp(expr_ty value, expr_ty name, int lineno, int col_offset, PyArena *arena) +{ + expr_ty p; + if (!value) { + PyErr_SetString(PyExc_ValueError, + "field value is required for AssExp"); + return NULL; + } + p = (expr_ty)PyArena_Malloc(arena, sizeof(*p)); + if (!p) + return NULL; + p->kind = AssExp_kind; + p->v.AssExp.value = value; + p->v.AssExp.name = name; + p->lineno = lineno; + p->col_offset = col_offset; + return p; +} + +expr_ty BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int col_offset, PyArena *arena) { @@ -2583,6 +2610,20 @@ goto failed; Py_DECREF(value); break; + case AssExp_kind: + result = PyType_GenericNew(AssExp_type, NULL, NULL); + if (!result) goto failed; + value = ast2obj_expr(o->v.AssExp.value); + if (!value) goto failed; + if (PyObject_SetAttrString(result, "value", value) == -1) + goto failed; + Py_DECREF(value); + value = ast2obj_expr(o->v.AssExp.name); + if (!value) goto failed; + if (PyObject_SetAttrString(result, "name", value) == -1) + goto failed; + Py_DECREF(value); + break; case BinOp_kind: result = PyType_GenericNew(BinOp_type, NULL, NULL); if (!result) goto failed; @@ -4700,6 +4741,37 @@ if (*out == NULL) goto failed; return 0; } + if (PyObject_IsInstance(obj, (PyObject*)AssExp_type)) { + expr_ty value; + expr_ty name; + + if (PyObject_HasAttrString(obj, "value")) { + int res; + tmp = PyObject_GetAttrString(obj, "value"); + if (tmp == NULL) goto failed; + res = obj2ast_expr(tmp, &value, arena); + if (res != 0) goto failed; + Py_XDECREF(tmp); + tmp = NULL; + } else { + PyErr_SetString(PyExc_TypeError, "required field \"value\" missing from AssExp"); + return 1; + } + if (PyObject_HasAttrString(obj, "name")) { + int res; + tmp = PyObject_GetAttrString(obj, "name"); + if (tmp == NULL) goto failed; + res = obj2ast_expr(tmp, &name, arena); + if (res != 0) goto failed; + Py_XDECREF(tmp); + tmp = NULL; + } else { + name = NULL; + } + *out = AssExp(value, name, lineno, col_offset, arena); + if (*out == NULL) goto failed; + return 0; + } if (PyObject_IsInstance(obj, (PyObject*)BinOp_type)) { expr_ty left; operator_ty op; @@ -6478,6 +6550,8 @@ NULL; if (PyDict_SetItemString(d, "BoolOp", (PyObject*)BoolOp_type) < 0) return NULL; + if (PyDict_SetItemString(d, "AssExp", (PyObject*)AssExp_type) < 0) + return NULL; if (PyDict_SetItemString(d, "BinOp", (PyObject*)BinOp_type) < 0) return NULL; if (PyDict_SetItemString(d, "UnaryOp", (PyObject*)UnaryOp_type) < 0) Index: Include/graminit.h =================================================================== --- Include/graminit.h (revision 70295) +++ Include/graminit.h (working copy) @@ -56,28 +56,29 @@ #define comp_op 309 #define star_expr 310 #define expr 311 -#define xor_expr 312 -#define and_expr 313 -#define shift_expr 314 -#define arith_expr 315 -#define term 316 -#define factor 317 -#define power 318 -#define atom 319 -#define testlist_comp 320 -#define trailer 321 -#define subscriptlist 322 -#define subscript 323 -#define sliceop 324 -#define exprlist 325 -#define testlist 326 -#define dictorsetmaker 327 -#define classdef 328 -#define arglist 329 -#define argument 330 -#define comp_iter 331 -#define comp_for 332 -#define comp_if 333 -#define testlist1 334 -#define encoding_decl 335 -#define yield_expr 336 +#define assexp 312 +#define xor_expr 313 +#define and_expr 314 +#define shift_expr 315 +#define arith_expr 316 +#define term 317 +#define factor 318 +#define power 319 +#define atom 320 +#define testlist_comp 321 +#define trailer 322 +#define subscriptlist 323 +#define subscript 324 +#define sliceop 325 +#define exprlist 326 +#define testlist 327 +#define dictorsetmaker 328 +#define classdef 329 +#define arglist 330 +#define argument 331 +#define comp_iter 332 +#define comp_for 333 +#define comp_if 334 +#define testlist1 335 +#define encoding_decl 336 +#define yield_expr 337 Index: Include/Python-ast.h =================================================================== --- Include/Python-ast.h (revision 70295) +++ Include/Python-ast.h (working copy) @@ -181,13 +181,13 @@ int col_offset; }; -enum _expr_kind {BoolOp_kind=1, BinOp_kind=2, UnaryOp_kind=3, Lambda_kind=4, - IfExp_kind=5, Dict_kind=6, Set_kind=7, ListComp_kind=8, - SetComp_kind=9, DictComp_kind=10, GeneratorExp_kind=11, - Yield_kind=12, Compare_kind=13, Call_kind=14, Num_kind=15, - Str_kind=16, Bytes_kind=17, Ellipsis_kind=18, - Attribute_kind=19, Subscript_kind=20, Starred_kind=21, - Name_kind=22, List_kind=23, Tuple_kind=24}; +enum _expr_kind {BoolOp_kind=1, AssExp_kind=2, BinOp_kind=3, UnaryOp_kind=4, + Lambda_kind=5, IfExp_kind=6, Dict_kind=7, Set_kind=8, + ListComp_kind=9, SetComp_kind=10, DictComp_kind=11, + GeneratorExp_kind=12, Yield_kind=13, Compare_kind=14, + Call_kind=15, Num_kind=16, Str_kind=17, Bytes_kind=18, + Ellipsis_kind=19, Attribute_kind=20, Subscript_kind=21, + Starred_kind=22, Name_kind=23, List_kind=24, Tuple_kind=25}; struct _expr { enum _expr_kind kind; union { @@ -197,6 +197,11 @@ } BoolOp; struct { + expr_ty value; + expr_ty name; + } AssExp; + + struct { expr_ty left; operator_ty op; expr_ty right; @@ -459,6 +464,9 @@ #define BoolOp(a0, a1, a2, a3, a4) _Py_BoolOp(a0, a1, a2, a3, a4) expr_ty _Py_BoolOp(boolop_ty op, asdl_seq * values, int lineno, int col_offset, PyArena *arena); +#define AssExp(a0, a1, a2, a3, a4) _Py_AssExp(a0, a1, a2, a3, a4) +expr_ty _Py_AssExp(expr_ty value, expr_ty name, int lineno, int col_offset, + PyArena *arena); #define BinOp(a0, a1, a2, a3, a4, a5) _Py_BinOp(a0, a1, a2, a3, a4, a5) expr_ty _Py_BinOp(expr_ty left, operator_ty op, expr_ty right, int lineno, int col_offset, PyArena *arena); Index: Grammar/Grammar =================================================================== --- Grammar/Grammar (revision 70295) +++ Grammar/Grammar (working copy) @@ -79,7 +79,7 @@ except_clause: 'except' [test ['as' NAME]] suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT -test: or_test ['if' or_test 'else' test] | lambdef +test: or_test ['if' or_test 'else' test] | lambdef test_nocond: or_test | lambdef_nocond lambdef: 'lambda' [varargslist] ':' test lambdef_nocond: 'lambda' [varargslist] ':' test_nocond @@ -89,7 +89,8 @@ comparison: star_expr (comp_op star_expr)* comp_op: '<'|'>'|'=='|'>='|'<='|'!='|'in'|'not' 'in'|'is'|'is' 'not' star_expr: ['*'] expr -expr: xor_expr ('|' xor_expr)* +expr: assexp ('|' assexp)* +assexp: xor_expr ['->' xor_expr] xor_expr: and_expr ('^' and_expr)* and_expr: shift_expr ('&' shift_expr)* shift_expr: arith_expr (('<<'|'>>') arith_expr)* Index: Parser/Python.asdl =================================================================== --- Parser/Python.asdl (revision 70295) +++ Parser/Python.asdl (working copy) @@ -49,6 +49,10 @@ -- BoolOp() can use left & right? expr = BoolOp(boolop op, expr* values) + + -- the following allows assignments in expressions. + | AssExp(expr value, expr? name) + | BinOp(expr left, operator op, expr right) | UnaryOp(unaryop op, expr operand) | Lambda(arguments args, expr body) @@ -72,6 +76,7 @@ | Ellipsis -- other literals? bools? + -- the following expression can appear in assignment context | Attribute(expr value, identifier attr, expr_context ctx) | Subscript(expr value, slice slice, expr_context ctx) Index: Lib/symbol.py =================================================================== --- Lib/symbol.py (revision 70295) +++ Lib/symbol.py (working copy) @@ -66,31 +66,32 @@ comp_op = 309 star_expr = 310 expr = 311 -xor_expr = 312 -and_expr = 313 -shift_expr = 314 -arith_expr = 315 -term = 316 -factor = 317 -power = 318 -atom = 319 -testlist_comp = 320 -trailer = 321 -subscriptlist = 322 -subscript = 323 -sliceop = 324 -exprlist = 325 -testlist = 326 -dictorsetmaker = 327 -classdef = 328 -arglist = 329 -argument = 330 -comp_iter = 331 -comp_for = 332 -comp_if = 333 -testlist1 = 334 -encoding_decl = 335 -yield_expr = 336 +assexp = 312 +xor_expr = 313 +and_expr = 314 +shift_expr = 315 +arith_expr = 316 +term = 317 +factor = 318 +power = 319 +atom = 320 +testlist_comp = 321 +trailer = 322 +subscriptlist = 323 +subscript = 324 +sliceop = 325 +exprlist = 326 +testlist = 327 +dictorsetmaker = 328 +classdef = 329 +arglist = 330 +argument = 331 +comp_iter = 332 +comp_for = 333 +comp_if = 334 +testlist1 = 335 +encoding_decl = 336 +yield_expr = 337 #--end constants-- sym_name = {} Index: Lib/test/test_parser.py =================================================================== --- Lib/test/test_parser.py (revision 70295) +++ Lib/test/test_parser.py (working copy) @@ -487,7 +487,7 @@ def test_deeply_nested_list(self): # XXX used to be 99 levels in 2.x - e = self._nested_expression(93) + e = self._nested_expression(88) st = parser.expr(e) st.compile() Index: Modules/parsermodule.c =================================================================== --- Modules/parsermodule.c (revision 70295) +++ Modules/parsermodule.c (working copy) @@ -924,6 +924,7 @@ #define validate_semi(ch) validate_terminal(ch, SEMI, ";") #define validate_star(ch) validate_terminal(ch, STAR, "*") #define validate_vbar(ch) validate_terminal(ch, VBAR, "|") +#define validate_rarrow(ch) validate_terminal(ch, RARROW, "->") #define validate_doublestar(ch) validate_terminal(ch, DOUBLESTAR, "**") #define validate_dot(ch) validate_terminal(ch, DOT, ".") #define validate_at(ch) validate_terminal(ch, AT, "@") @@ -950,6 +951,7 @@ VALIDATER(not_test); VALIDATER(comparison); VALIDATER(comp_op); VALIDATER(star_expr); VALIDATER(expr); +VALIDATER(assexp_expr); VALIDATER(xor_expr); VALIDATER(and_expr); VALIDATER(shift_expr); VALIDATER(arith_expr); VALIDATER(term); VALIDATER(factor); @@ -2159,16 +2161,31 @@ int nch = NCH(tree); int res = (validate_ntype(tree, expr) && is_odd(nch) - && validate_xor_expr(CHILD(tree, 0))); + && validate_assexp_expr(CHILD(tree, 0))); for (j = 2; res && (j < nch); j += 2) - res = (validate_xor_expr(CHILD(tree, j)) + res = (validate_assexp_expr(CHILD(tree, j)) && validate_vbar(CHILD(tree, j - 1))); return (res); } +static int +validate_assexp_expr(node *tree) +{ + int j; + int nch = NCH(tree); + int res = (validate_ntype(tree, assexp) + && is_odd(nch) + && validate_xor_expr(CHILD(tree, 0))); + for (j = 2; res && (j < nch); j += 2) + res = (validate_vbar(CHILD(tree, j - 1)) + && validate_xor_expr(CHILD(tree, j))); + return (res); +} + + static int validate_xor_expr(node *tree) { @@ -2991,6 +3008,9 @@ case expr: res = validate_expr(tree); break; + case assexp: + res = validate_expr(tree); + break; case xor_expr: res = validate_xor_expr(tree); break;