diff -r 4c0874ed4cfd Lib/test/test_parser.py --- a/Lib/test/test_parser.py Sun Apr 29 19:17:05 2012 +0100 +++ b/Lib/test/test_parser.py Sun Apr 29 21:58:25 2012 +0100 @@ -61,6 +61,10 @@ " if (yield):\n" " yield x\n") + def test_nonlocal_statement(self): + self.check_suite("def f(): nonlocal x") + self.check_suite("def f(): nonlocal x, y") + def test_expressions(self): self.check_expr("foo(1)") self.check_expr("[1, 2, 3]") diff -r 4c0874ed4cfd Modules/parsermodule.c --- a/Modules/parsermodule.c Sun Apr 29 19:17:05 2012 +0100 +++ b/Modules/parsermodule.c Sun Apr 29 21:58:25 2012 +0100 @@ -956,7 +956,8 @@ VALIDATER(return_stmt); VALIDATER(raise_stmt); VALIDATER(import_stmt); VALIDATER(import_stmt); VALIDATER(import_name); VALIDATER(yield_stmt); -VALIDATER(global_stmt); VALIDATER(assert_stmt); +VALIDATER(global_stmt); VALIDATER(nonlocal_stmt); +VALIDATER(assert_stmt); VALIDATER(compound_stmt); VALIDATER(test_or_star_expr); VALIDATER(while); VALIDATER(for); VALIDATER(try); VALIDATER(except_clause); @@ -1480,6 +1481,7 @@ || (ntype == flow_stmt) || (ntype == import_stmt) || (ntype == global_stmt) + || (ntype == nonlocal_stmt) || (ntype == assert_stmt)) res = validate_node(CHILD(tree, 0)); else { @@ -1887,6 +1889,27 @@ return (res); } +static int +validate_nonlocal_stmt(node *tree) +{ + int j; + int nch = NCH(tree); + int res = (validate_ntype(tree, nonlocal_stmt) + && is_even(nch) && (nch >= 2)); + + if (!res && !PyErr_Occurred()) + err_string("illegal nonlocal statement"); + + if (res) + res = (validate_name(CHILD(tree, 0), "nonlocal") + && validate_ntype(CHILD(tree, 1), NAME)); + for (j = 2; res && (j < nch); j += 2) + res = (validate_comma(CHILD(tree, j)) + && validate_ntype(CHILD(tree, j + 1), NAME)); + + return res; +} + /* assert_stmt: * @@ -2951,8 +2974,8 @@ break; case small_stmt: /* - * expr_stmt | del_stmt | pass_stmt | flow_stmt - * | import_stmt | global_stmt | assert_stmt + * expr_stmt | del_stmt | pass_stmt | flow_stmt | + * import_stmt | global_stmt | nonlocal_stmt | assert_stmt */ res = validate_small_stmt(tree); break; @@ -3019,6 +3042,9 @@ case global_stmt: res = validate_global_stmt(tree); break; + case nonlocal_stmt: + res = validate_nonlocal_stmt(tree); + break; case assert_stmt: res = validate_assert_stmt(tree); break;