if ( (ntype == if_stmt) || (ntype == while_stmt) || (ntype == for_stmt) || (ntype == try_stmt) || (ntype == funcdef) || (ntype == classdef)) res = validate_node(tree); else { res = 0; PyErr_Format(parser_error, "Illegal compound statement type: %d.", TYPE(tree)); } return (res);} static intvalidate_yield_or_testlist(node *tree){ if (TYPE(tree) == yield_expr) return validate_yield_expr(tree); else return validate_testlist(tree);} static intvalidate_expr_stmt(node *tree){ int j; int nch = NCH(tree); int res = (validate_ntype(tree, expr_stmt) && is_odd(nch) && validate_testlist(CHILD(tree, 0))); if (res && nch == 3 && TYPE(CHILD(tree, 1)) == augassign) { res = validate_numnodes(CHILD(tree, 1), 1, "augassign") && validate_yield_or_testlist(CHILD(tree, 2)); if (res) { char *s = STR(CHILD(CHILD(tree, 1), 0)); res = (strcmp(s, "+=") == 0 || strcmp(s, "-=") == 0 || strcmp(s, "*=") == 0 || strcmp(s, "/=") == 0 || strcmp(s, "//=") == 0 || strcmp(s, "%=") == 0 || strcmp(s, "&=") == 0 || strcmp(s, "|=") == 0 || strcmp(s, "^=") == 0 || strcmp(s, "<<=") == 0 || strcmp(s, ">>=") == 0 || strcmp(s, "**=") == 0); if (!res) err_string("illegal augmmented assignment operator"); } } else { for (j = 1; res && (j < nch); j += 2) res = validate_equal(CHILD(tree, j)) && validate_yield_or_testlist(CHILD(tree, j + 1)); } return (res);} /* print_stmt: * * 'print' ( [ test (',' test)* [','] ] * | '>>' test [ (',' test)+ [','] ] ) */static intvalidate_print_stmt(node *tree){ int nch = NCH(tree); int res = (validate_ntype(tree, print_stmt) && (nch > 0) && validate_name(CHILD(tree, 0), "print")); if (res && nch > 1) { int sym = TYPE(CHILD(tree, 1)); int i = 1; int allow_trailing_comma = 1; if (sym == test) res = validate_test(CHILD(tree, i++)); else { if (nch < 3) res = validate_numnodes(tree, 3, "print_stmt"); else { res = (validate_ntype(CHILD(tree, i), RIGHTSHIFT) && validate_test(CHILD(tree, i+1))); i += 2; allow_trailing_comma = 0; } } if (res) { /* ... (',' test)* [','] */ while (res && i+2 <= nch) { res = (validate_comma(CHILD(tree, i)) && validate_test(CHILD(tree, i+1))); allow_trailing_comma = 1; i += 2; } if (res && !allow_trailing_comma) res = validate_numnodes(tree, i, "print_stmt"); else if (res && i < nch) res = validate_comma(CHILD(tree, i)); } } return (res);} static intvalidate_del_stmt(node *tree){ return (validate_numnodes(tree, 2, "del_stmt") && validate_name(CHILD(tree, 0), "del") && validate_exprlist(CHILD(tree, 1)));} static intvalidate_return_stmt(node *tree){ int nch = NCH(tree); int res = (validate_ntype(tree, return_stmt) && ((nch == 1) || (nch == 2)) && validate_name(CHILD(tree, 0), "return")); if (res && (nch == 2)) res = validate_testlist(CHILD(tree, 1)); return (res);} static intvalidate_raise_stmt(node *tree){ int nch = NCH(tree); int res = (validate_ntype(tree, raise_stmt) && ((nch == 1) || (nch == 2) || (nch == 4) || (nch == 6))); if (res) { res = validate_name(CHILD(tree, 0), "raise"); if (res && (nch >= 2)) res = validate_test(CHILD(tree, 1)); if (res && nch > 2) { res = (validate_comma(CHILD(tree, 2)) && validate_test(CHILD(tree, 3))); if (res && (nch > 4)) res = (validate_comma(CHILD(tree, 4)) && validate_test(CHILD(tree, 5))); } } else (void) validate_numnodes(tree, 2, "raise"); if (res && (nch == 4)) res = (validate_comma(CHILD(tree, 2)) && validate_test(CHILD(tree, 3))); return (res);} /* yield_expr: 'yield' [testlist] */static intvalidate_yield_expr(node *tree){ int nch = NCH(tree); int res = (validate_ntype(tree, yield_expr) && ((nch == 1) || (nch == 2)) && validate_name(CHILD(tree, 0), "yield")); if (res && (nch == 2)) res = validate_testlist(CHILD(tree, 1)); return (res);} /* yield_stmt: yield_expr */static intvalidate_yield_stmt(node *tree){ return (validate_ntype(tree, yield_stmt) && validate_numnodes(tree, 1, "yield_stmt") && validate_yield_expr(CHILD(tree, 0)));} static intvalidate_import_as_name(node *tree){ int nch = NCH(tree); int ok = validate_ntype(tree, import_as_name); if (ok) { if (nch == 1) ok = validate_name(CHILD(tree, 0), NULL); else if (nch == 3) ok = (validate_name(CHILD(tree, 0), NULL) && validate_name(CHILD(tree, 1), "as") && validate_name(CHILD(tree, 2), NULL)); else ok = validate_numnodes(tree, 3, "import_as_name"); } return ok;} /* dotted_name: NAME ("." NAME)* */static intvalidate_dotted_name(node *tree){ int nch = NCH(tree); int res = (validate_ntype(tree, dotted_name) && is_odd(nch) && validate_name(CHILD(tree, 0), NULL)); int i; for (i = 1; res && (i < nch); i += 2) { res = (validate_dot(CHILD(tree, i)) && validate_name(CHILD(tree, i+1), NULL)); } return res;} /* dotted_as_name: dotted_name [NAME NAME] */static intvalidate_dotted_as_name(node *tree){ int nch = NCH(tree); int res = validate_ntype(tree, dotted_as_name); if (res) { if (nch == 1) res = validate_dotted_name(CHILD(tree, 0)); else if (nch == 3) res = (validate_dotted_name(CHILD(tree, 0)) && validate_name(CHILD(tree, 1), "as") && validate_name(CHILD(tree, 2), NULL)); else { res = 0; err_string("illegal number of children for dotted_as_name"); } } return res;} /* dotted_as_name (',' dotted_as_name)* */static intvalidate_dotted_as_names(node *tree){ int nch = NCH(tree); int res = is_odd(nch) && validate_dotted_as_name(CHILD(tree, 0)); int i; for (i = 1; res && (i < nch); i += 2) res = (validate_comma(CHILD(tree, i)) && validate_dotted_as_name(CHILD(tree, i + 1))); return (res);} /* import_as_name (',' import_as_name)* [','] */static intvalidate_import_as_names(node *tree){ int nch = NCH(tree); int res = validate_import_as_name(CHILD(tree, 0)); int i; for (i = 1; res && (i + 1 < nch); i += 2) res = (validate_comma(CHILD(tree, i)) && validate_import_as_name(CHILD(tree, i + 1))); return (res);} /* 'import' dotted_as_names */static intvalidate_import_name(node *tree){ return (validate_ntype(tree, import_name) && validate_numnodes(tree, 2, "import_name") && validate_name(CHILD(tree, 0), "import") && validate_dotted_as_names(CHILD(tree, 1)));} /* Helper function to count the number of leading dots in * 'from ...module import name' */static intcount_from_dots(node *tree){ int i; for (i = 0; i < NCH(tree); i++) if (TYPE(CHILD(tree, i)) != DOT) break; return i;} /* 'from' ('.'* dotted_name | '.') 'import' ('*' | '(' import_as_names ')' | * import_as_names */static intvalidate_import_from(node *tree){ int nch = NCH(tree); int ndots = count_from_dots(tree); int havename = (TYPE(CHILD(tree, ndots + 1)) == dotted_name); int offset = ndots + havename; int res = validate_ntype(tree, import_from) && (nch >= 4 + ndots) && validate_name(CHILD(tree, 0), "from") && (!havename || validate_dotted_name(CHILD(tree, ndots + 1))) && validate_name(CHILD(tree, offset + 1), "import"); if (res && TYPE(CHILD(tree, offset + 2)) == LPAR) res = ((nch == offset + 5) && validate_lparen(CHILD(tree, offset + 2)) && validate_import_as_names(CHILD(tree, offset + 3)) && validate_rparen(CHILD(tree, offset + 4))); else if (res && TYPE(CHILD(tree, offset + 2)) != STAR) res = validate_import_as_names(CHILD(tree, offset + 2)); return (res);} /* import_stmt: import_name | import_from */static intvalidate_import_stmt(node *tree){ int nch = NCH(tree); int res = validate_numnodes(tree, 1, "import_stmt"); if (res) { int ntype = TYPE(CHILD(tree, 0)); if (ntype == import_name || ntype == import_from) res = validate_node(CHILD(tree, 0)); else { res = 0; err_string("illegal import_stmt child type"); } } else if (nch == 1) { res = 0; PyErr_Format(parser_error, "Unrecognized child node of import_stmt: %d.", TYPE(CHILD(tree, 0))); } return (res);} static intvalidate_global_stmt(node *tree){ int j; int nch = NCH(tree); int res = (validate_ntype(tree, global_stmt) && is_even(nch) && (nch >= 2)); if (!res && !PyErr_Occurred()) err_string("illegal global statement"); if (res) res = (validate_name(CHILD(tree, 0), "global") && 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);} /* exec_stmt: * * 'exec' expr ['in' test [',' test]] */static intvalidate_exec_stmt(node *tree){ int nch = NCH(tree); int res = (validate_ntype(tree, exec_stmt) && ((nch == 2) || (nch == 4) || (nch == 6)) && validate_name(CHILD(tree, 0), "exec") && validate_expr(CHILD(tree, 1))); if (!res && !PyErr_Occurred()) err_string("illegal exec statement"); if (res && (nch > 2)) res = (validate_name(CHILD(tree, 2), "in") && validate_test(CHILD(tree, 3))); if (res && (nch == 6)) res = (validate_comma(CHILD(tree, 4)) && validate_test(CHILD(tree, 5))); return (res);} /* assert_stmt: * * 'assert' test [',' test] */static intvalidate_assert_stmt(node *tree){ int nch = NCH(tree); int res = (validate_ntype(tree, assert_stmt) && ((nch == 2) || (nch == 4)) && (validate_name(CHILD(tree, 0), "assert")) && validate_test(CHILD(tree, 1))); if (!res && !PyErr_Occurred()) err_string("illegal assert statement"); if (res && (nch > 2)) res = (validate_comma(CHILD(tree, 2)) && validate_test(CHILD(tree, 3))); return (res);} static intvalidate_while(node *tree){ int nch = NCH(tree); int res = (validate_ntype(tree, while_stmt) && ((nch == 4) || (nch == 7)) && validate_name(CHILD(tree, 0), "while") && validate_test(CHILD(tree, 1)) && validate_colon(CHILD(tree, 2)) && validate_suite(CHILD(tree, 3))); if (res && (nch == 7)) res = (validate_name(CHILD(tree, 4), "else") && validate_colon(CHILD(tree, 5)) && validate_suite(CHILD(tree, 6))); return (res);} static intvalidate_for(node *tree){ int nch = NCH(tree); int res = (validate_ntype(tree, for_stmt) && ((nch == 6) || (nch == 9)) && validate_name(CHILD(tree, 0), "for") && validate_exprlist(CHILD(tree, 1)) && validate_name(CHILD(tree, 2), "in") && validate_testlist(CHILD(tree, 3)) && validate_colon(CHILD(tree, 4)) && validate_suite(CHILD(tree, 5))); if (res && (nch == 9)) res = (validate_name(CHILD(tree, 6), "else") && validate_colon(CHILD(tree, 7)) && validate_suite(CHILD(tree, 8))); return (res);} /* try_stmt: * 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite] * | 'try' ':' suite 'finally' ':' suite * */static intvalidate_try(node *tree){ int nch = NCH(tree); int pos = 3; int res = (validate_ntype(tree, try_stmt) && (nch >= 6) && ((nch % 3) == 0)); if (res) res = (validate_name(CHILD(tree, 0), "try") && validate_colon(CHILD(tree, 1)) && validate_suite(CHILD(tree, 2)) && validate_colon(CHILD(tree, nch - 2)) && validate_suite(CHILD(tree, nch - 1)));Lines 1501–2000 of 3279. Previous lines Load more
if ( (ntype == if_stmt) || (ntype == while_stmt) || (ntype == for_stmt) || (ntype == try_stmt) || (ntype == funcdef) || (ntype == classdef)) res = validate_node(tree); else { res = 0; PyErr_Format(parser_error, "Illegal compound statement type: %d.", TYPE(tree)); } return (res); } static int validate_yield_or_testlist(node *tree) { if (TYPE(tree) == yield_expr) return validate_yield_expr(tree); else return validate_testlist(tree); } static int validate_expr_stmt(node *tree) { int j; int nch = NCH(tree); int res = (validate_ntype(tree, expr_stmt) && is_odd(nch) && validate_testlist(CHILD(tree, 0))); if (res && nch == 3 && TYPE(CHILD(tree, 1)) == augassign) { res = validate_numnodes(CHILD(tree, 1), 1, "augassign") && validate_yield_or_testlist(CHILD(tree, 2)); if (res) { char *s = STR(CHILD(CHILD(tree, 1), 0)); res = (strcmp(s, "+=") == 0 || strcmp(s, "-=") == 0 || strcmp(s, "*=") == 0 || strcmp(s, "/=") == 0 || strcmp(s, "//=") == 0 || strcmp(s, "%=") == 0 || strcmp(s, "&=") == 0 || strcmp(s, "|=") == 0 || strcmp(s, "^=") == 0 || strcmp(s, "<<=") == 0 || strcmp(s, ">>=") == 0 || strcmp(s, "**=") == 0); if (!res) err_string("illegal augmmented assignment operator"); } } else { for (j = 1; res && (j < nch); j += 2) res = validate_equal(CHILD(tree, j)) && validate_yield_or_testlist(CHILD(tree, j + 1)); } return (res); } /* print_stmt: * * 'print' ( [ test (',' test)* [','] ] * | '>>' test [ (',' test)+ [','] ] ) */ static int validate_print_stmt(node *tree) { int nch = NCH(tree); int res = (validate_ntype(tree, print_stmt) && (nch > 0) && validate_name(CHILD(tree, 0), "print")); if (res && nch > 1) { int sym = TYPE(CHILD(tree, 1)); int i = 1; int allow_trailing_comma = 1; if (sym == test) res = validate_test(CHILD(tree, i++)); else { if (nch < 3) res = validate_numnodes(tree, 3, "print_stmt"); else { res = (validate_ntype(CHILD(tree, i), RIGHTSHIFT) && validate_test(CHILD(tree, i+1))); i += 2; allow_trailing_comma = 0; } } if (res) { /* ... (',' test)* [','] */ while (res && i+2 <= nch) { res = (validate_comma(CHILD(tree, i)) && validate_test(CHILD(tree, i+1))); allow_trailing_comma = 1; i += 2; } if (res && !allow_trailing_comma) res = validate_numnodes(tree, i, "print_stmt"); else if (res && i < nch) res = validate_comma(CHILD(tree, i)); } } return (res); } static int validate_del_stmt(node *tree) { return (validate_numnodes(tree, 2, "del_stmt") && validate_name(CHILD(tree, 0), "del") && validate_exprlist(CHILD(tree, 1))); } static int validate_return_stmt(node *tree) { int nch = NCH(tree); int res = (validate_ntype(tree, return_stmt) && ((nch == 1) || (nch == 2)) && validate_name(CHILD(tree, 0), "return")); if (res && (nch == 2)) res = validate_testlist(CHILD(tree, 1)); return (res); } static int validate_raise_stmt(node *tree) { int nch = NCH(tree); int res = (validate_ntype(tree, raise_stmt) && ((nch == 1) || (nch == 2) || (nch == 4) || (nch == 6))); if (res) { res = validate_name(CHILD(tree, 0), "raise"); if (res && (nch >= 2)) res = validate_test(CHILD(tree, 1)); if (res && nch > 2) { res = (validate_comma(CHILD(tree, 2)) && validate_test(CHILD(tree, 3))); if (res && (nch > 4)) res = (validate_comma(CHILD(tree, 4)) && validate_test(CHILD(tree, 5))); } } else (void) validate_numnodes(tree, 2, "raise"); if (res && (nch == 4)) res = (validate_comma(CHILD(tree, 2)) && validate_test(CHILD(tree, 3))); return (res); } /* yield_expr: 'yield' [testlist] */ static int validate_yield_expr(node *tree) { int nch = NCH(tree); int res = (validate_ntype(tree, yield_expr) && ((nch == 1) || (nch == 2)) && validate_name(CHILD(tree, 0), "yield")); if (res && (nch == 2)) res = validate_testlist(CHILD(tree, 1)); return (res); } /* yield_stmt: yield_expr */ static int validate_yield_stmt(node *tree) { return (validate_ntype(tree, yield_stmt) && validate_numnodes(tree, 1, "yield_stmt") && validate_yield_expr(CHILD(tree, 0))); } static int validate_import_as_name(node *tree) { int nch = NCH(tree); int ok = validate_ntype(tree, import_as_name); if (ok) { if (nch == 1) ok = validate_name(CHILD(tree, 0), NULL); else if (nch == 3) ok = (validate_name(CHILD(tree, 0), NULL) && validate_name(CHILD(tree, 1), "as") && validate_name(CHILD(tree, 2), NULL)); else ok = validate_numnodes(tree, 3, "import_as_name"); } return ok; } /* dotted_name: NAME ("." NAME)* */ static int validate_dotted_name(node *tree) { int nch = NCH(tree); int res = (validate_ntype(tree, dotted_name) && is_odd(nch) && validate_name(CHILD(tree, 0), NULL)); int i; for (i = 1; res && (i < nch); i += 2) { res = (validate_dot(CHILD(tree, i)) && validate_name(CHILD(tree, i+1), NULL)); } return res; } /* dotted_as_name: dotted_name [NAME NAME] */ static int validate_dotted_as_name(node *tree) { int nch = NCH(tree); int res = validate_ntype(tree, dotted_as_name); if (res) { if (nch == 1) res = validate_dotted_name(CHILD(tree, 0)); else if (nch == 3) res = (validate_dotted_name(CHILD(tree, 0)) && validate_name(CHILD(tree, 1), "as") && validate_name(CHILD(tree, 2), NULL)); else { res = 0; err_string("illegal number of children for dotted_as_name"); } } return res; } /* dotted_as_name (',' dotted_as_name)* */ static int validate_dotted_as_names(node *tree) { int nch = NCH(tree); int res = is_odd(nch) && validate_dotted_as_name(CHILD(tree, 0)); int i; for (i = 1; res && (i < nch); i += 2) res = (validate_comma(CHILD(tree, i)) && validate_dotted_as_name(CHILD(tree, i + 1))); return (res); } /* import_as_name (',' import_as_name)* [','] */ static int validate_import_as_names(node *tree) { int nch = NCH(tree); int res = validate_import_as_name(CHILD(tree, 0)); int i; for (i = 1; res && (i + 1 < nch); i += 2) res = (validate_comma(CHILD(tree, i)) && validate_import_as_name(CHILD(tree, i + 1))); return (res); } /* 'import' dotted_as_names */ static int validate_import_name(node *tree) { return (validate_ntype(tree, import_name) && validate_numnodes(tree, 2, "import_name") && validate_name(CHILD(tree, 0), "import") && validate_dotted_as_names(CHILD(tree, 1))); } /* Helper function to count the number of leading dots in * 'from ...module import name' */ static int count_from_dots(node *tree) { int i; for (i = 0; i < NCH(tree); i++) if (TYPE(CHILD(tree, i)) != DOT) break; return i; } /* 'from' ('.'* dotted_name | '.') 'import' ('*' | '(' import_as_names ')' | * import_as_names */ static int validate_import_from(node *tree) { int nch = NCH(tree); int ndots = count_from_dots(tree); int havename = (TYPE(CHILD(tree, ndots + 1)) == dotted_name); int offset = ndots + havename; int res = validate_ntype(tree, import_from) && (nch >= 4 + ndots) && validate_name(CHILD(tree, 0), "from") && (!havename || validate_dotted_name(CHILD(tree, ndots + 1))) && validate_name(CHILD(tree, offset + 1), "import"); if (res && TYPE(CHILD(tree, offset + 2)) == LPAR) res = ((nch == offset + 5) && validate_lparen(CHILD(tree, offset + 2)) && validate_import_as_names(CHILD(tree, offset + 3)) && validate_rparen(CHILD(tree, offset + 4))); else if (res && TYPE(CHILD(tree, offset + 2)) != STAR) res = validate_import_as_names(CHILD(tree, offset + 2)); return (res); } /* import_stmt: import_name | import_from */ static int validate_import_stmt(node *tree) { int nch = NCH(tree); int res = validate_numnodes(tree, 1, "import_stmt"); if (res) { int ntype = TYPE(CHILD(tree, 0)); if (ntype == import_name || ntype == import_from) res = validate_node(CHILD(tree, 0)); else { res = 0; err_string("illegal import_stmt child type"); } } else if (nch == 1) { res = 0; PyErr_Format(parser_error, "Unrecognized child node of import_stmt: %d.", TYPE(CHILD(tree, 0))); } return (res); } static int validate_global_stmt(node *tree) { int j; int nch = NCH(tree); int res = (validate_ntype(tree, global_stmt) && is_even(nch) && (nch >= 2)); if (!res && !PyErr_Occurred()) err_string("illegal global statement"); if (res) res = (validate_name(CHILD(tree, 0), "global") && 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); } /* exec_stmt: * * 'exec' expr ['in' test [',' test]] */ static int validate_exec_stmt(node *tree) { int nch = NCH(tree); int res = (validate_ntype(tree, exec_stmt) && ((nch == 2) || (nch == 4) || (nch == 6)) && validate_name(CHILD(tree, 0), "exec") && validate_expr(CHILD(tree, 1))); if (!res && !PyErr_Occurred()) err_string("illegal exec statement"); if (res && (nch > 2)) res = (validate_name(CHILD(tree, 2), "in") && validate_test(CHILD(tree, 3))); if (res && (nch == 6)) res = (validate_comma(CHILD(tree, 4)) && validate_test(CHILD(tree, 5))); return (res); } /* assert_stmt: * * 'assert' test [',' test] */ static int validate_assert_stmt(node *tree) { int nch = NCH(tree); int res = (validate_ntype(tree, assert_stmt) && ((nch == 2) || (nch == 4)) && (validate_name(CHILD(tree, 0), "assert")) && validate_test(CHILD(tree, 1))); if (!res && !PyErr_Occurred()) err_string("illegal assert statement"); if (res && (nch > 2)) res = (validate_comma(CHILD(tree, 2)) && validate_test(CHILD(tree, 3))); return (res); } static int validate_while(node *tree) { int nch = NCH(tree); int res = (validate_ntype(tree, while_stmt) && ((nch == 4) || (nch == 7)) && validate_name(CHILD(tree, 0), "while") && validate_test(CHILD(tree, 1)) && validate_colon(CHILD(tree, 2)) && validate_suite(CHILD(tree, 3))); if (res && (nch == 7)) res = (validate_name(CHILD(tree, 4), "else") && validate_colon(CHILD(tree, 5)) && validate_suite(CHILD(tree, 6))); return (res); } static int validate_for(node *tree) { int nch = NCH(tree); int res = (validate_ntype(tree, for_stmt) && ((nch == 6) || (nch == 9)) && validate_name(CHILD(tree, 0), "for") && validate_exprlist(CHILD(tree, 1)) && validate_name(CHILD(tree, 2), "in") && validate_testlist(CHILD(tree, 3)) && validate_colon(CHILD(tree, 4)) && validate_suite(CHILD(tree, 5))); if (res && (nch == 9)) res = (validate_name(CHILD(tree, 6), "else") && validate_colon(CHILD(tree, 7)) && validate_suite(CHILD(tree, 8))); return (res); } /* try_stmt: * 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite] * | 'try' ':' suite 'finally' ':' suite * */ static int validate_try(node *tree) { int nch = NCH(tree); int pos = 3; int res = (validate_ntype(tree, try_stmt) && (nch >= 6) && ((nch % 3) == 0)); if (res) res = (validate_name(CHILD(tree, 0), "try") && validate_colon(CHILD(tree, 1)) && validate_suite(CHILD(tree, 2)) && validate_colon(CHILD(tree, nch - 2)) && validate_suite(CHILD(tree, nch - 1)));