📄 parsermodule.c
字号:
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);
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_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_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);
if (!res)
err_string("illegal augmmented assignment operator");
}
}
else {
for (j = 1; res && (j < nch); j += 2)
res = (validate_equal(CHILD(tree, j))
&& validate_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_stmt: 'yield' testlist
*/
static int
validate_yield_stmt(node *tree)
{
return (validate_ntype(tree, yield_stmt)
&& validate_numnodes(tree, 2, "yield_stmt")
&& validate_name(CHILD(tree, 0), "yield")
&& validate_testlist(CHILD(tree, 1)));
}
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;
}
/* import_stmt:
*
* 'import' dotted_as_name (',' dotted_as_name)*
* | 'from' dotted_name 'import' ('*' | import_as_name (',' import_as_name)*)
*/
static int
validate_import_stmt(node *tree)
{
int nch = NCH(tree);
int res = (validate_ntype(tree, import_stmt)
&& (nch >= 2) && is_even(nch)
&& validate_ntype(CHILD(tree, 0), NAME));
if (res && (strcmp(STR(CHILD(tree, 0)), "import") == 0)) {
int j;
res = validate_dotted_as_name(CHILD(tree, 1));
for (j = 2; res && (j < nch); j += 2)
res = (validate_comma(CHILD(tree, j))
&& validate_dotted_as_name(CHILD(tree, j + 1)));
}
else if (res && (res = validate_name(CHILD(tree, 0), "from"))) {
res = ((nch >= 4) && is_even(nch)
&& validate_dotted_name(CHILD(tree, 1))
&& validate_name(CHILD(tree, 2), "import"));
if (nch == 4) {
if (TYPE(CHILD(tree, 3)) == import_as_name)
res = validate_import_as_name(CHILD(tree, 3));
else
res = validate_star(CHILD(tree, 3));
}
else {
/* 'from' dotted_name 'import' import_as_name
* (',' import_as_name)+
*/
int j;
res = validate_import_as_name(CHILD(tree, 3));
for (j = 4; res && (j < nch); j += 2)
res = (validate_comma(CHILD(tree, j))
&& validate_import_as_name(CHILD(tree, j + 1)));
}
}
else
res = 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)
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);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -