diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c index 25550e71198..d952ec311ab 100644 --- a/Modules/parsermodule.c +++ b/Modules/parsermodule.c @@ -861,7 +861,8 @@ VALIDATER(listmaker); VALIDATER(yield_stmt); VALIDATER(testlist1); VALIDATER(gen_for); VALIDATER(gen_iter); VALIDATER(gen_if); VALIDATER(testlist_gexp); VALIDATER(yield_expr); -VALIDATER(yield_or_testlist); +VALIDATER(yield_or_testlist); VALIDATER(or_test); +VALIDATER(old_test); VALIDATER(old_lambdef); #undef VALIDATER @@ -1095,7 +1096,7 @@ static int validate_testlist_safe(node *tree) { return (validate_repeating_list(tree, testlist_safe, - validate_test, "testlist_safe")); + validate_old_test, "testlist_safe")); } @@ -1315,7 +1316,7 @@ validate_gen_for(node *tree) res = (validate_name(CHILD(tree, 0), "for") && validate_exprlist(CHILD(tree, 1)) && validate_name(CHILD(tree, 2), "in") - && validate_test(CHILD(tree, 3))); + && validate_or_test(CHILD(tree, 3))); return res; } @@ -2047,6 +2048,37 @@ validate_test(node *tree) res = ((nch == 1) && validate_lambdef(CHILD(tree, 0))); else if (res) { + res = validate_or_test(CHILD(tree, 0)); + res = (res && (nch == 1 || (nch == 5 && + validate_name(CHILD(tree, 1), "if") && + validate_or_test(CHILD(tree, 2)) && + validate_name(CHILD(tree, 3), "else") && + validate_test(CHILD(tree, 4))))); + } + return (res); +} + +static int +validate_old_test(node *tree) +{ + int nch = NCH(tree); + int res = validate_ntype(tree, old_test) && (nch == 1); + + if (res && (TYPE(CHILD(tree, 0)) == old_lambdef)) + res = (validate_old_lambdef(CHILD(tree, 0))); + else if (res) { + res = (validate_or_test(CHILD(tree, 0))); + } + return (res); +} + +static int +validate_or_test(node *tree) +{ + int nch = NCH(tree); + int res = validate_ntype(tree, or_test) && is_odd(nch); + + if (res) { int pos; res = validate_and_test(CHILD(tree, 0)); for (pos = 1; res && (pos < nch); pos += 2) @@ -2533,6 +2565,25 @@ validate_lambdef(node *tree) } +static int +validate_old_lambdef(node *tree) +{ + int nch = NCH(tree); + int res = (validate_ntype(tree, old_lambdef) + && ((nch == 3) || (nch == 4)) + && validate_name(CHILD(tree, 0), "lambda") + && validate_colon(CHILD(tree, nch - 2)) + && validate_test(CHILD(tree, nch - 1))); + + if (res && (nch == 4)) + res = validate_varargslist(CHILD(tree, 1)); + else if (!res && !PyErr_Occurred()) + (void) validate_numnodes(tree, 3, "old_lambdef"); + + return (res); +} + + /* arglist: * * (argument ',')* (argument [','] | '*' test [',' '**' test] | '**' test)