cinap_lenrekadd hg and python4bb9e2215 years agoHistory
3279 lines · 93.5 KB · C
RawDownload
        /*  ... '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