/* ... 'else' ':' suite */ res = (validate_name(CHILD(tree, nch - 3), "else") && validate_colon(CHILD(tree, nch - 2)) && validate_suite(CHILD(tree, nch - 1))); nch -= 3; } else if (!res && !PyErr_Occurred()) (void) validate_numnodes(tree, 4, "if"); if ((nch % 4) != 0) /* Will catch the case for nch < 4 */ res = validate_numnodes(tree, 0, "if"); else if (res && (nch > 4)) { /* ... ('elif' test ':' suite)+ ... */ int j = 4; while ((j < nch) && res) { res = (validate_name(CHILD(tree, j), "elif") && validate_colon(CHILD(tree, j + 2)) && validate_test(CHILD(tree, j + 1)) && validate_suite(CHILD(tree, j + 3))); j += 4; } } return (res);} /* parameters: * '(' [varargslist] ')' * */static intvalidate_parameters(node *tree){ int nch = NCH(tree); int res = validate_ntype(tree, parameters) && ((nch == 2) || (nch == 3)); if (res) { res = (validate_lparen(CHILD(tree, 0)) && validate_rparen(CHILD(tree, nch - 1))); if (res && (nch == 3)) res = validate_varargslist(CHILD(tree, 1)); } else { (void) validate_numnodes(tree, 2, "parameters"); } return (res);} /* validate_suite() * * suite: * simple_stmt * | NEWLINE INDENT stmt+ DEDENT */static intvalidate_suite(node *tree){ int nch = NCH(tree); int res = (validate_ntype(tree, suite) && ((nch == 1) || (nch >= 4))); if (res && (nch == 1)) res = validate_simple_stmt(CHILD(tree, 0)); else if (res) { /* NEWLINE INDENT stmt+ DEDENT */ res = (validate_newline(CHILD(tree, 0)) && validate_indent(CHILD(tree, 1)) && validate_stmt(CHILD(tree, 2)) && validate_dedent(CHILD(tree, nch - 1))); if (res && (nch > 4)) { int i = 3; --nch; /* forget the DEDENT */ for ( ; res && (i < nch); ++i) res = validate_stmt(CHILD(tree, i)); } else if (nch < 4) res = validate_numnodes(tree, 4, "suite"); } return (res);} static intvalidate_testlist(node *tree){ return (validate_repeating_list(tree, testlist, validate_test, "testlist"));} static intvalidate_testlist1(node *tree){ return (validate_repeating_list(tree, testlist1, validate_test, "testlist1"));} static intvalidate_testlist_safe(node *tree){ return (validate_repeating_list(tree, testlist_safe, validate_old_test, "testlist_safe"));} /* '*' NAME [',' '**' NAME] | '**' NAME */static intvalidate_varargslist_trailer(node *tree, int start){ int nch = NCH(tree); int res = 0; int sym; if (nch <= start) { err_string("expected variable argument trailer for varargslist"); return 0; } sym = TYPE(CHILD(tree, start)); if (sym == STAR) { /* * ('*' NAME [',' '**' NAME] */ if (nch-start == 2) res = validate_name(CHILD(tree, start+1), NULL); else if (nch-start == 5) res = (validate_name(CHILD(tree, start+1), NULL) && validate_comma(CHILD(tree, start+2)) && validate_doublestar(CHILD(tree, start+3)) && validate_name(CHILD(tree, start+4), NULL)); } else if (sym == DOUBLESTAR) { /* * '**' NAME */ if (nch-start == 2) res = validate_name(CHILD(tree, start+1), NULL); } if (!res) err_string("illegal variable argument trailer for varargslist"); return res;} /* validate_varargslist() * * varargslist: * (fpdef ['=' test] ',')* * ('*' NAME [',' '**' NAME] * | '**' NAME) * | fpdef ['=' test] (',' fpdef ['=' test])* [','] * */static intvalidate_varargslist(node *tree){ int nch = NCH(tree); int res = validate_ntype(tree, varargslist) && (nch != 0); int sym; if (!res) return 0; if (nch < 1) { err_string("varargslist missing child nodes"); return 0; } sym = TYPE(CHILD(tree, 0)); if (sym == STAR || sym == DOUBLESTAR) /* whole thing matches: * '*' NAME [',' '**' NAME] | '**' NAME */ res = validate_varargslist_trailer(tree, 0); else if (sym == fpdef) { int i = 0; sym = TYPE(CHILD(tree, nch-1)); if (sym == NAME) { /* * (fpdef ['=' test] ',')+ * ('*' NAME [',' '**' NAME] * | '**' NAME) */ /* skip over (fpdef ['=' test] ',')+ */ while (res && (i+2 <= nch)) { res = validate_fpdef(CHILD(tree, i)); ++i; if (res && TYPE(CHILD(tree, i)) == EQUAL && (i+2 <= nch)) { res = (validate_equal(CHILD(tree, i)) && validate_test(CHILD(tree, i+1))); if (res) i += 2; } if (res && i < nch) { res = validate_comma(CHILD(tree, i)); ++i; if (res && i < nch && (TYPE(CHILD(tree, i)) == DOUBLESTAR || TYPE(CHILD(tree, i)) == STAR)) break; } } /* ... '*' NAME [',' '**' NAME] | '**' NAME * i --^^^ */ if (res) res = validate_varargslist_trailer(tree, i); } else { /* * fpdef ['=' test] (',' fpdef ['=' test])* [','] */ /* strip trailing comma node */ if (sym == COMMA) { res = validate_comma(CHILD(tree, nch-1)); if (!res) return 0; --nch; } /* * fpdef ['=' test] (',' fpdef ['=' test])* */ res = validate_fpdef(CHILD(tree, 0)); ++i; if (res && (i+2 <= nch) && TYPE(CHILD(tree, i)) == EQUAL) { res = (validate_equal(CHILD(tree, i)) && validate_test(CHILD(tree, i+1))); i += 2; } /* * ... (',' fpdef ['=' test])* * i ---^^^ */ while (res && (nch - i) >= 2) { res = (validate_comma(CHILD(tree, i)) && validate_fpdef(CHILD(tree, i+1))); i += 2; if (res && (nch - i) >= 2 && TYPE(CHILD(tree, i)) == EQUAL) { res = (validate_equal(CHILD(tree, i)) && validate_test(CHILD(tree, i+1))); i += 2; } } if (res && nch - i != 0) { res = 0; err_string("illegal formation for varargslist"); } } } return res;} /* list_iter: list_for | list_if */static intvalidate_list_iter(node *tree){ int res = (validate_ntype(tree, list_iter) && validate_numnodes(tree, 1, "list_iter")); if (res && TYPE(CHILD(tree, 0)) == list_for) res = validate_list_for(CHILD(tree, 0)); else res = validate_list_if(CHILD(tree, 0)); return res;} /* gen_iter: gen_for | gen_if */static intvalidate_gen_iter(node *tree){ int res = (validate_ntype(tree, gen_iter) && validate_numnodes(tree, 1, "gen_iter")); if (res && TYPE(CHILD(tree, 0)) == gen_for) res = validate_gen_for(CHILD(tree, 0)); else res = validate_gen_if(CHILD(tree, 0)); return res;} /* list_for: 'for' exprlist 'in' testlist [list_iter] */static intvalidate_list_for(node *tree){ int nch = NCH(tree); int res; if (nch == 5) res = validate_list_iter(CHILD(tree, 4)); else res = validate_numnodes(tree, 4, "list_for"); if (res) res = (validate_name(CHILD(tree, 0), "for") && validate_exprlist(CHILD(tree, 1)) && validate_name(CHILD(tree, 2), "in") && validate_testlist_safe(CHILD(tree, 3))); return res;} /* gen_for: 'for' exprlist 'in' test [gen_iter] */static intvalidate_gen_for(node *tree){ int nch = NCH(tree); int res; if (nch == 5) res = validate_gen_iter(CHILD(tree, 4)); else res = validate_numnodes(tree, 4, "gen_for"); if (res) res = (validate_name(CHILD(tree, 0), "for") && validate_exprlist(CHILD(tree, 1)) && validate_name(CHILD(tree, 2), "in") && validate_or_test(CHILD(tree, 3))); return res;} /* list_if: 'if' old_test [list_iter] */static intvalidate_list_if(node *tree){ int nch = NCH(tree); int res; if (nch == 3) res = validate_list_iter(CHILD(tree, 2)); else res = validate_numnodes(tree, 2, "list_if"); if (res) res = (validate_name(CHILD(tree, 0), "if") && validate_old_test(CHILD(tree, 1))); return res;} /* gen_if: 'if' old_test [gen_iter] */static intvalidate_gen_if(node *tree){ int nch = NCH(tree); int res; if (nch == 3) res = validate_gen_iter(CHILD(tree, 2)); else res = validate_numnodes(tree, 2, "gen_if"); if (res) res = (validate_name(CHILD(tree, 0), "if") && validate_old_test(CHILD(tree, 1))); return res;} /* validate_fpdef() * * fpdef: * NAME * | '(' fplist ')' */static intvalidate_fpdef(node *tree){ int nch = NCH(tree); int res = validate_ntype(tree, fpdef); if (res) { if (nch == 1) res = validate_ntype(CHILD(tree, 0), NAME); else if (nch == 3) res = (validate_lparen(CHILD(tree, 0)) && validate_fplist(CHILD(tree, 1)) && validate_rparen(CHILD(tree, 2))); else res = validate_numnodes(tree, 1, "fpdef"); } return (res);} static intvalidate_fplist(node *tree){ return (validate_repeating_list(tree, fplist, validate_fpdef, "fplist"));} /* simple_stmt | compound_stmt * */static intvalidate_stmt(node *tree){ int res = (validate_ntype(tree, stmt) && validate_numnodes(tree, 1, "stmt")); if (res) { tree = CHILD(tree, 0); if (TYPE(tree) == simple_stmt) res = validate_simple_stmt(tree); else res = validate_compound_stmt(tree); } return (res);} /* small_stmt (';' small_stmt)* [';'] NEWLINE * */static intvalidate_simple_stmt(node *tree){ int nch = NCH(tree); int res = (validate_ntype(tree, simple_stmt) && (nch >= 2) && validate_small_stmt(CHILD(tree, 0)) && validate_newline(CHILD(tree, nch - 1))); if (nch < 2) res = validate_numnodes(tree, 2, "simple_stmt"); --nch; /* forget the NEWLINE */ if (res && is_even(nch)) res = validate_semi(CHILD(tree, --nch)); if (res && (nch > 2)) { int i; for (i = 1; res && (i < nch); i += 2) res = (validate_semi(CHILD(tree, i)) && validate_small_stmt(CHILD(tree, i + 1))); } return (res);} static intvalidate_small_stmt(node *tree){ int nch = NCH(tree); int res = validate_numnodes(tree, 1, "small_stmt"); if (res) { int ntype = TYPE(CHILD(tree, 0)); if ( (ntype == expr_stmt) || (ntype == print_stmt) || (ntype == del_stmt) || (ntype == pass_stmt) || (ntype == flow_stmt) || (ntype == import_stmt) || (ntype == global_stmt) || (ntype == assert_stmt) || (ntype == exec_stmt)) res = validate_node(CHILD(tree, 0)); else { res = 0; err_string("illegal small_stmt child type"); } } else if (nch == 1) { res = 0; PyErr_Format(parser_error, "Unrecognized child node of small_stmt: %d.", TYPE(CHILD(tree, 0))); } return (res);} /* compound_stmt: * if_stmt | while_stmt | for_stmt | try_stmt | funcdef | classdef */static intvalidate_compound_stmt(node *tree){ int res = (validate_ntype(tree, compound_stmt) && validate_numnodes(tree, 1, "compound_stmt")); int ntype; if (!res) return (0); tree = CHILD(tree, 0); ntype = TYPE(tree);Lines 1001–1500 of 3279. Previous lines Load more
/* ... 'else' ':' suite */ res = (validate_name(CHILD(tree, nch - 3), "else") && validate_colon(CHILD(tree, nch - 2)) && validate_suite(CHILD(tree, nch - 1))); nch -= 3; } else if (!res && !PyErr_Occurred()) (void) validate_numnodes(tree, 4, "if"); if ((nch % 4) != 0) /* Will catch the case for nch < 4 */ res = validate_numnodes(tree, 0, "if"); else if (res && (nch > 4)) { /* ... ('elif' test ':' suite)+ ... */ int j = 4; while ((j < nch) && res) { res = (validate_name(CHILD(tree, j), "elif") && validate_colon(CHILD(tree, j + 2)) && validate_test(CHILD(tree, j + 1)) && validate_suite(CHILD(tree, j + 3))); j += 4; } } return (res); } /* parameters: * '(' [varargslist] ')' * */ static int validate_parameters(node *tree) { int nch = NCH(tree); int res = validate_ntype(tree, parameters) && ((nch == 2) || (nch == 3)); if (res) { res = (validate_lparen(CHILD(tree, 0)) && validate_rparen(CHILD(tree, nch - 1))); if (res && (nch == 3)) res = validate_varargslist(CHILD(tree, 1)); } else { (void) validate_numnodes(tree, 2, "parameters"); } return (res); } /* validate_suite() * * suite: * simple_stmt * | NEWLINE INDENT stmt+ DEDENT */ static int validate_suite(node *tree) { int nch = NCH(tree); int res = (validate_ntype(tree, suite) && ((nch == 1) || (nch >= 4))); if (res && (nch == 1)) res = validate_simple_stmt(CHILD(tree, 0)); else if (res) { /* NEWLINE INDENT stmt+ DEDENT */ res = (validate_newline(CHILD(tree, 0)) && validate_indent(CHILD(tree, 1)) && validate_stmt(CHILD(tree, 2)) && validate_dedent(CHILD(tree, nch - 1))); if (res && (nch > 4)) { int i = 3; --nch; /* forget the DEDENT */ for ( ; res && (i < nch); ++i) res = validate_stmt(CHILD(tree, i)); } else if (nch < 4) res = validate_numnodes(tree, 4, "suite"); } return (res); } static int validate_testlist(node *tree) { return (validate_repeating_list(tree, testlist, validate_test, "testlist")); } static int validate_testlist1(node *tree) { return (validate_repeating_list(tree, testlist1, validate_test, "testlist1")); } static int validate_testlist_safe(node *tree) { return (validate_repeating_list(tree, testlist_safe, validate_old_test, "testlist_safe")); } /* '*' NAME [',' '**' NAME] | '**' NAME */ static int validate_varargslist_trailer(node *tree, int start) { int nch = NCH(tree); int res = 0; int sym; if (nch <= start) { err_string("expected variable argument trailer for varargslist"); return 0; } sym = TYPE(CHILD(tree, start)); if (sym == STAR) { /* * ('*' NAME [',' '**' NAME] */ if (nch-start == 2) res = validate_name(CHILD(tree, start+1), NULL); else if (nch-start == 5) res = (validate_name(CHILD(tree, start+1), NULL) && validate_comma(CHILD(tree, start+2)) && validate_doublestar(CHILD(tree, start+3)) && validate_name(CHILD(tree, start+4), NULL)); } else if (sym == DOUBLESTAR) { /* * '**' NAME */ if (nch-start == 2) res = validate_name(CHILD(tree, start+1), NULL); } if (!res) err_string("illegal variable argument trailer for varargslist"); return res; } /* validate_varargslist() * * varargslist: * (fpdef ['=' test] ',')* * ('*' NAME [',' '**' NAME] * | '**' NAME) * | fpdef ['=' test] (',' fpdef ['=' test])* [','] * */ static int validate_varargslist(node *tree) { int nch = NCH(tree); int res = validate_ntype(tree, varargslist) && (nch != 0); int sym; if (!res) return 0; if (nch < 1) { err_string("varargslist missing child nodes"); return 0; } sym = TYPE(CHILD(tree, 0)); if (sym == STAR || sym == DOUBLESTAR) /* whole thing matches: * '*' NAME [',' '**' NAME] | '**' NAME */ res = validate_varargslist_trailer(tree, 0); else if (sym == fpdef) { int i = 0; sym = TYPE(CHILD(tree, nch-1)); if (sym == NAME) { /* * (fpdef ['=' test] ',')+ * ('*' NAME [',' '**' NAME] * | '**' NAME) */ /* skip over (fpdef ['=' test] ',')+ */ while (res && (i+2 <= nch)) { res = validate_fpdef(CHILD(tree, i)); ++i; if (res && TYPE(CHILD(tree, i)) == EQUAL && (i+2 <= nch)) { res = (validate_equal(CHILD(tree, i)) && validate_test(CHILD(tree, i+1))); if (res) i += 2; } if (res && i < nch) { res = validate_comma(CHILD(tree, i)); ++i; if (res && i < nch && (TYPE(CHILD(tree, i)) == DOUBLESTAR || TYPE(CHILD(tree, i)) == STAR)) break; } } /* ... '*' NAME [',' '**' NAME] | '**' NAME * i --^^^ */ if (res) res = validate_varargslist_trailer(tree, i); } else { /* * fpdef ['=' test] (',' fpdef ['=' test])* [','] */ /* strip trailing comma node */ if (sym == COMMA) { res = validate_comma(CHILD(tree, nch-1)); if (!res) return 0; --nch; } /* * fpdef ['=' test] (',' fpdef ['=' test])* */ res = validate_fpdef(CHILD(tree, 0)); ++i; if (res && (i+2 <= nch) && TYPE(CHILD(tree, i)) == EQUAL) { res = (validate_equal(CHILD(tree, i)) && validate_test(CHILD(tree, i+1))); i += 2; } /* * ... (',' fpdef ['=' test])* * i ---^^^ */ while (res && (nch - i) >= 2) { res = (validate_comma(CHILD(tree, i)) && validate_fpdef(CHILD(tree, i+1))); i += 2; if (res && (nch - i) >= 2 && TYPE(CHILD(tree, i)) == EQUAL) { res = (validate_equal(CHILD(tree, i)) && validate_test(CHILD(tree, i+1))); i += 2; } } if (res && nch - i != 0) { res = 0; err_string("illegal formation for varargslist"); } } } return res; } /* list_iter: list_for | list_if */ static int validate_list_iter(node *tree) { int res = (validate_ntype(tree, list_iter) && validate_numnodes(tree, 1, "list_iter")); if (res && TYPE(CHILD(tree, 0)) == list_for) res = validate_list_for(CHILD(tree, 0)); else res = validate_list_if(CHILD(tree, 0)); return res; } /* gen_iter: gen_for | gen_if */ static int validate_gen_iter(node *tree) { int res = (validate_ntype(tree, gen_iter) && validate_numnodes(tree, 1, "gen_iter")); if (res && TYPE(CHILD(tree, 0)) == gen_for) res = validate_gen_for(CHILD(tree, 0)); else res = validate_gen_if(CHILD(tree, 0)); return res; } /* list_for: 'for' exprlist 'in' testlist [list_iter] */ static int validate_list_for(node *tree) { int nch = NCH(tree); int res; if (nch == 5) res = validate_list_iter(CHILD(tree, 4)); else res = validate_numnodes(tree, 4, "list_for"); if (res) res = (validate_name(CHILD(tree, 0), "for") && validate_exprlist(CHILD(tree, 1)) && validate_name(CHILD(tree, 2), "in") && validate_testlist_safe(CHILD(tree, 3))); return res; } /* gen_for: 'for' exprlist 'in' test [gen_iter] */ static int validate_gen_for(node *tree) { int nch = NCH(tree); int res; if (nch == 5) res = validate_gen_iter(CHILD(tree, 4)); else res = validate_numnodes(tree, 4, "gen_for"); if (res) res = (validate_name(CHILD(tree, 0), "for") && validate_exprlist(CHILD(tree, 1)) && validate_name(CHILD(tree, 2), "in") && validate_or_test(CHILD(tree, 3))); return res; } /* list_if: 'if' old_test [list_iter] */ static int validate_list_if(node *tree) { int nch = NCH(tree); int res; if (nch == 3) res = validate_list_iter(CHILD(tree, 2)); else res = validate_numnodes(tree, 2, "list_if"); if (res) res = (validate_name(CHILD(tree, 0), "if") && validate_old_test(CHILD(tree, 1))); return res; } /* gen_if: 'if' old_test [gen_iter] */ static int validate_gen_if(node *tree) { int nch = NCH(tree); int res; if (nch == 3) res = validate_gen_iter(CHILD(tree, 2)); else res = validate_numnodes(tree, 2, "gen_if"); if (res) res = (validate_name(CHILD(tree, 0), "if") && validate_old_test(CHILD(tree, 1))); return res; } /* validate_fpdef() * * fpdef: * NAME * | '(' fplist ')' */ static int validate_fpdef(node *tree) { int nch = NCH(tree); int res = validate_ntype(tree, fpdef); if (res) { if (nch == 1) res = validate_ntype(CHILD(tree, 0), NAME); else if (nch == 3) res = (validate_lparen(CHILD(tree, 0)) && validate_fplist(CHILD(tree, 1)) && validate_rparen(CHILD(tree, 2))); else res = validate_numnodes(tree, 1, "fpdef"); } return (res); } static int validate_fplist(node *tree) { return (validate_repeating_list(tree, fplist, validate_fpdef, "fplist")); } /* simple_stmt | compound_stmt * */ static int validate_stmt(node *tree) { int res = (validate_ntype(tree, stmt) && validate_numnodes(tree, 1, "stmt")); if (res) { tree = CHILD(tree, 0); if (TYPE(tree) == simple_stmt) res = validate_simple_stmt(tree); else res = validate_compound_stmt(tree); } return (res); } /* small_stmt (';' small_stmt)* [';'] NEWLINE * */ static int validate_simple_stmt(node *tree) { int nch = NCH(tree); int res = (validate_ntype(tree, simple_stmt) && (nch >= 2) && validate_small_stmt(CHILD(tree, 0)) && validate_newline(CHILD(tree, nch - 1))); if (nch < 2) res = validate_numnodes(tree, 2, "simple_stmt"); --nch; /* forget the NEWLINE */ if (res && is_even(nch)) res = validate_semi(CHILD(tree, --nch)); if (res && (nch > 2)) { int i; for (i = 1; res && (i < nch); i += 2) res = (validate_semi(CHILD(tree, i)) && validate_small_stmt(CHILD(tree, i + 1))); } return (res); } static int validate_small_stmt(node *tree) { int nch = NCH(tree); int res = validate_numnodes(tree, 1, "small_stmt"); if (res) { int ntype = TYPE(CHILD(tree, 0)); if ( (ntype == expr_stmt) || (ntype == print_stmt) || (ntype == del_stmt) || (ntype == pass_stmt) || (ntype == flow_stmt) || (ntype == import_stmt) || (ntype == global_stmt) || (ntype == assert_stmt) || (ntype == exec_stmt)) res = validate_node(CHILD(tree, 0)); else { res = 0; err_string("illegal small_stmt child type"); } } else if (nch == 1) { res = 0; PyErr_Format(parser_error, "Unrecognized child node of small_stmt: %d.", TYPE(CHILD(tree, 0))); } return (res); } /* compound_stmt: * if_stmt | while_stmt | for_stmt | try_stmt | funcdef | classdef */ static int validate_compound_stmt(node *tree) { int res = (validate_ntype(tree, compound_stmt) && validate_numnodes(tree, 1, "compound_stmt")); int ntype; if (!res) return (0); tree = CHILD(tree, 0); ntype = TYPE(tree);