1 /* parsermodule.c 2 * 3 * Copyright 1995-1996 by Fred L. Drake, Jr. and Virginia Polytechnic 4 * Institute and State University, Blacksburg, Virginia, USA. 5 * Portions copyright 1991-1995 by Stichting Mathematisch Centrum, 6 * Amsterdam, The Netherlands. Copying is permitted under the terms 7 * associated with the main Python distribution, with the additional 8 * restriction that this additional notice be included and maintained 9 * on all distributed copies. 10 * 11 * This module serves to replace the original parser module written 12 * by Guido. The functionality is not matched precisely, but the 13 * original may be implemented on top of this. This is desirable 14 * since the source of the text to be parsed is now divorced from 15 * this interface. 16 * 17 * Unlike the prior interface, the ability to give a parse tree 18 * produced by Python code as a tuple to the compiler is enabled by 19 * this module. See the documentation for more details. 20 * 21 * I've added some annotations that help with the lint code-checking 22 * program, but they're not complete by a long shot. The real errors 23 * that lint detects are gone, but there are still warnings with 24 * Py_[X]DECREF() and Py_[X]INCREF() macros. The lint annotations 25 * look like "NOTE(...)". 26 */ 27 28 #include "Python.h" /* general Python API */ 29 #include "Python-ast.h" /* mod_ty */ 30 #include "graminit.h" /* symbols defined in the grammar */ 31 #include "node.h" /* internal parser structure */ 32 #include "errcode.h" /* error codes for PyNode_*() */ 33 #include "token.h" /* token definitions */ 34 #include "grammar.h" 35 #include "parsetok.h" 36 /* ISTERMINAL() / ISNONTERMINAL() */ 37 #include "compile.h" 38 #undef Yield 39 #include "ast.h" 40 #include "pyarena.h" 41 42 extern grammar _PyParser_Grammar; /* From graminit.c */ 43 44 #ifdef lint 45 #include <note.h> 46 #else 47 #define NOTE(x) 48 #endif 49 50 /* String constants used to initialize module attributes. 51 * 52 */ 53 static char parser_copyright_string[] = 54 "Copyright 1995-1996 by Virginia Polytechnic Institute & State\n\ 55 University, Blacksburg, Virginia, USA, and Fred L. Drake, Jr., Reston,\n\ 56 Virginia, USA. Portions copyright 1991-1995 by Stichting Mathematisch\n\ 57 Centrum, Amsterdam, The Netherlands."; 58 59 60 PyDoc_STRVAR(parser_doc_string, 61 "This is an interface to Python's internal parser."); 62 63 static char parser_version_string[] = "0.5"; 64 65 66 typedef PyObject* (*SeqMaker) (Py_ssize_t length); 67 typedef int (*SeqInserter) (PyObject* sequence, 68 Py_ssize_t index, 69 PyObject* element); 70 71 /* The function below is copyrighted by Stichting Mathematisch Centrum. The 72 * original copyright statement is included below, and continues to apply 73 * in full to the function immediately following. All other material is 74 * original, copyrighted by Fred L. Drake, Jr. and Virginia Polytechnic 75 * Institute and State University. Changes were made to comply with the 76 * new naming conventions. Added arguments to provide support for creating 77 * lists as well as tuples, and optionally including the line numbers. 78 */ 79 80 81 static PyObject* 82 node2tuple(node *n, /* node to convert */ 83 SeqMaker mkseq, /* create sequence */ 84 SeqInserter addelem, /* func. to add elem. in seq. */ 85 int lineno, /* include line numbers? */ 86 int col_offset) /* include column offsets? */ 87 { 88 if (n == NULL) { 89 Py_INCREF(Py_None); 90 return (Py_None); 91 } 92 if (ISNONTERMINAL(TYPE(n))) { 93 int i; 94 PyObject *v; 95 PyObject *w; 96 97 v = mkseq(1 + NCH(n) + (TYPE(n) == encoding_decl)); 98 if (v == NULL) 99 return (v); 100 w = PyInt_FromLong(TYPE(n)); 101 if (w == NULL) { 102 Py_DECREF(v); 103 return ((PyObject*) NULL); 104 } 105 (void) addelem(v, 0, w); 106 for (i = 0; i < NCH(n); i++) { 107 w = node2tuple(CHILD(n, i), mkseq, addelem, lineno, col_offset); 108 if (w == NULL) { 109 Py_DECREF(v); 110 return ((PyObject*) NULL); 111 } 112 (void) addelem(v, i+1, w); 113 } 114 115 if (TYPE(n) == encoding_decl) 116 (void) addelem(v, i+1, PyString_FromString(STR(n))); 117 return (v); 118 } 119 else if (ISTERMINAL(TYPE(n))) { 120 PyObject *result = mkseq(2 + lineno + col_offset); 121 if (result != NULL) { 122 (void) addelem(result, 0, PyInt_FromLong(TYPE(n))); 123 (void) addelem(result, 1, PyString_FromString(STR(n))); 124 if (lineno == 1) 125 (void) addelem(result, 2, PyInt_FromLong(n->n_lineno)); 126 if (col_offset == 1) 127 (void) addelem(result, 3, PyInt_FromLong(n->n_col_offset)); 128 } 129 return (result); 130 } 131 else { 132 PyErr_SetString(PyExc_SystemError, 133 "unrecognized parse tree node type"); 134 return ((PyObject*) NULL); 135 } 136 } 137 /* 138 * End of material copyrighted by Stichting Mathematisch Centrum. 139 */ 140 141 142 143 /* There are two types of intermediate objects we're interested in: 144 * 'eval' and 'exec' types. These constants can be used in the st_type 145 * field of the object type to identify which any given object represents. 146 * These should probably go in an external header to allow other extensions 147 * to use them, but then, we really should be using C++ too. ;-) 148 */ 149 150 #define PyST_EXPR 1 151 #define PyST_SUITE 2 152 153 154 /* These are the internal objects and definitions required to implement the 155 * ST type. Most of the internal names are more reminiscent of the 'old' 156 * naming style, but the code uses the new naming convention. 157 */ 158 159 static PyObject* 160 parser_error = 0; 161 162 163 typedef struct { 164 PyObject_HEAD /* standard object header */ 165 node* st_node; /* the node* returned by the parser */ 166 int st_type; /* EXPR or SUITE ? */ 167 PyCompilerFlags st_flags; /* Parser and compiler flags */ 168 } PyST_Object; 169 170 171 static void parser_free(PyST_Object *st); 172 static int parser_compare(PyST_Object *left, PyST_Object *right); 173 static PyObject *parser_getattr(PyObject *self, char *name); 174 175 176 static 177 PyTypeObject PyST_Type = { 178 PyVarObject_HEAD_INIT(NULL, 0) 179 "parser.st", /* tp_name */ 180 (int) sizeof(PyST_Object), /* tp_basicsize */ 181 0, /* tp_itemsize */ 182 (destructor)parser_free, /* tp_dealloc */ 183 0, /* tp_print */ 184 parser_getattr, /* tp_getattr */ 185 0, /* tp_setattr */ 186 (cmpfunc)parser_compare, /* tp_compare */ 187 0, /* tp_repr */ 188 0, /* tp_as_number */ 189 0, /* tp_as_sequence */ 190 0, /* tp_as_mapping */ 191 0, /* tp_hash */ 192 0, /* tp_call */ 193 0, /* tp_str */ 194 0, /* tp_getattro */ 195 0, /* tp_setattro */ 196 197 /* Functions to access object as input/output buffer */ 198 0, /* tp_as_buffer */ 199 200 Py_TPFLAGS_DEFAULT, /* tp_flags */ 201 202 /* __doc__ */ 203 "Intermediate representation of a Python parse tree." 204 }; /* PyST_Type */ 205 206 207 static int 208 parser_compare_nodes(node *left, node *right) 209 { 210 int j; 211 212 if (TYPE(left) < TYPE(right)) 213 return (-1); 214 215 if (TYPE(right) < TYPE(left)) 216 return (1); 217 218 if (ISTERMINAL(TYPE(left))) 219 return (strcmp(STR(left), STR(right))); 220 221 if (NCH(left) < NCH(right)) 222 return (-1); 223 224 if (NCH(right) < NCH(left)) 225 return (1); 226 227 for (j = 0; j < NCH(left); ++j) { 228 int v = parser_compare_nodes(CHILD(left, j), CHILD(right, j)); 229 230 if (v != 0) 231 return (v); 232 } 233 return (0); 234 } 235 236 237 /* int parser_compare(PyST_Object* left, PyST_Object* right) 238 * 239 * Comparison function used by the Python operators ==, !=, <, >, <=, >= 240 * This really just wraps a call to parser_compare_nodes() with some easy 241 * checks and protection code. 242 * 243 */ 244 static int 245 parser_compare(PyST_Object *left, PyST_Object *right) 246 { 247 if (left == right) 248 return (0); 249 250 if ((left == 0) || (right == 0)) 251 return (-1); 252 253 return (parser_compare_nodes(left->st_node, right->st_node)); 254 } 255 256 257 /* parser_newstobject(node* st) 258 * 259 * Allocates a new Python object representing an ST. This is simply the 260 * 'wrapper' object that holds a node* and allows it to be passed around in 261 * Python code. 262 * 263 */ 264 static PyObject* 265 parser_newstobject(node *st, int type) 266 { 267 PyST_Object* o = PyObject_New(PyST_Object, &PyST_Type); 268 269 if (o != 0) { 270 o->st_node = st; 271 o->st_type = type; 272 o->st_flags.cf_flags = 0; 273 } 274 else { 275 PyNode_Free(st); 276 } 277 return ((PyObject*)o); 278 } 279 280 281 /* void parser_free(PyST_Object* st) 282 * 283 * This is called by a del statement that reduces the reference count to 0. 284 * 285 */ 286 static void 287 parser_free(PyST_Object *st) 288 { 289 PyNode_Free(st->st_node); 290 PyObject_Del(st); 291 } 292 293 294 /* parser_st2tuple(PyObject* self, PyObject* args, PyObject* kw) 295 * 296 * This provides conversion from a node* to a tuple object that can be 297 * returned to the Python-level caller. The ST object is not modified. 298 * 299 */ 300 static PyObject* 301 parser_st2tuple(PyST_Object *self, PyObject *args, PyObject *kw) 302 { 303 PyObject *line_option = 0; 304 PyObject *col_option = 0; 305 PyObject *res = 0; 306 int ok; 307 308 static char *keywords[] = {"ast", "line_info", "col_info", NULL}; 309 310 if (self == NULL) { 311 ok = PyArg_ParseTupleAndKeywords(args, kw, "O!|OO:st2tuple", keywords, 312 &PyST_Type, &self, &line_option, 313 &col_option); 314 } 315 else 316 ok = PyArg_ParseTupleAndKeywords(args, kw, "|OO:totuple", &keywords[1], 317 &line_option, &col_option); 318 if (ok != 0) { 319 int lineno = 0; 320 int col_offset = 0; 321 if (line_option != NULL) { 322 lineno = (PyObject_IsTrue(line_option) != 0) ? 1 : 0; 323 } 324 if (col_option != NULL) { 325 col_offset = (PyObject_IsTrue(col_option) != 0) ? 1 : 0; 326 } 327 /* 328 * Convert ST into a tuple representation. Use Guido's function, 329 * since it's known to work already. 330 */ 331 res = node2tuple(((PyST_Object*)self)->st_node, 332 PyTuple_New, PyTuple_SetItem, lineno, col_offset); 333 } 334 return (res); 335 } 336 337 static PyObject* 338 parser_ast2tuple(PyST_Object *self, PyObject *args, PyObject *kw) 339 { 340 if (PyErr_WarnPy3k("ast2tuple is removed in 3.x; use st2tuple", 1) < 0) 341 return NULL; 342 return parser_st2tuple(self, args, kw); 343 } 344 345 346 /* parser_st2list(PyObject* self, PyObject* args, PyObject* kw) 347 * 348 * This provides conversion from a node* to a list object that can be 349 * returned to the Python-level caller. The ST object is not modified. 350 * 351 */ 352 static PyObject* 353 parser_st2list(PyST_Object *self, PyObject *args, PyObject *kw) 354 { 355 PyObject *line_option = 0; 356 PyObject *col_option = 0; 357 PyObject *res = 0; 358 int ok; 359 360 static char *keywords[] = {"ast", "line_info", "col_info", NULL}; 361 362 if (self == NULL) 363 ok = PyArg_ParseTupleAndKeywords(args, kw, "O!|OO:st2list", keywords, 364 &PyST_Type, &self, &line_option, 365 &col_option); 366 else 367 ok = PyArg_ParseTupleAndKeywords(args, kw, "|OO:tolist", &keywords[1], 368 &line_option, &col_option); 369 if (ok) { 370 int lineno = 0; 371 int col_offset = 0; 372 if (line_option != 0) { 373 lineno = PyObject_IsTrue(line_option) ? 1 : 0; 374 } 375 if (col_option != NULL) { 376 col_offset = (PyObject_IsTrue(col_option) != 0) ? 1 : 0; 377 } 378 /* 379 * Convert ST into a tuple representation. Use Guido's function, 380 * since it's known to work already. 381 */ 382 res = node2tuple(self->st_node, 383 PyList_New, PyList_SetItem, lineno, col_offset); 384 } 385 return (res); 386 } 387 388 static PyObject* 389 parser_ast2list(PyST_Object *self, PyObject *args, PyObject *kw) 390 { 391 if (PyErr_WarnPy3k("ast2list is removed in 3.x; use st2list", 1) < 0) 392 return NULL; 393 return parser_st2list(self, args, kw); 394 } 395 396 397 /* parser_compilest(PyObject* self, PyObject* args) 398 * 399 * This function creates code objects from the parse tree represented by 400 * the passed-in data object. An optional file name is passed in as well. 401 * 402 */ 403 static PyObject* 404 parser_compilest(PyST_Object *self, PyObject *args, PyObject *kw) 405 { 406 PyObject* res = 0; 407 PyArena* arena; 408 mod_ty mod; 409 char* str = "<syntax-tree>"; 410 int ok; 411 412 static char *keywords[] = {"ast", "filename", NULL}; 413 414 if (self == NULL) 415 ok = PyArg_ParseTupleAndKeywords(args, kw, "O!|s:compilest", keywords, 416 &PyST_Type, &self, &str); 417 else 418 ok = PyArg_ParseTupleAndKeywords(args, kw, "|s:compile", &keywords[1], 419 &str); 420 421 if (ok) { 422 arena = PyArena_New(); 423 if (arena) { 424 mod = PyAST_FromNode(self->st_node, &(self->st_flags), str, arena); 425 if (mod) { 426 res = (PyObject *)PyAST_Compile(mod, str, &(self->st_flags), arena); 427 } 428 PyArena_Free(arena); 429 } 430 } 431 432 return (res); 433 } 434 435 static PyObject* 436 parser_compileast(PyST_Object *self, PyObject *args, PyObject *kw) 437 { 438 if (PyErr_WarnPy3k("compileast is removed in 3.x; use compilest", 1) < 0) 439 return NULL; 440 return parser_compilest(self, args, kw); 441 } 442 443 444 /* PyObject* parser_isexpr(PyObject* self, PyObject* args) 445 * PyObject* parser_issuite(PyObject* self, PyObject* args) 446 * 447 * Checks the passed-in ST object to determine if it is an expression or 448 * a statement suite, respectively. The return is a Python truth value. 449 * 450 */ 451 static PyObject* 452 parser_isexpr(PyST_Object *self, PyObject *args, PyObject *kw) 453 { 454 PyObject* res = 0; 455 int ok; 456 457 static char *keywords[] = {"ast", NULL}; 458 459 if (self == NULL) 460 ok = PyArg_ParseTupleAndKeywords(args, kw, "O!:isexpr", keywords, 461 &PyST_Type, &self); 462 else 463 ok = PyArg_ParseTupleAndKeywords(args, kw, ":isexpr", &keywords[1]); 464 465 if (ok) { 466 /* Check to see if the ST represents an expression or not. */ 467 res = (self->st_type == PyST_EXPR) ? Py_True : Py_False; 468 Py_INCREF(res); 469 } 470 return (res); 471 } 472 473 474 static PyObject* 475 parser_issuite(PyST_Object *self, PyObject *args, PyObject *kw) 476 { 477 PyObject* res = 0; 478 int ok; 479 480 static char *keywords[] = {"ast", NULL}; 481 482 if (self == NULL) 483 ok = PyArg_ParseTupleAndKeywords(args, kw, "O!:issuite", keywords, 484 &PyST_Type, &self); 485 else 486 ok = PyArg_ParseTupleAndKeywords(args, kw, ":issuite", &keywords[1]); 487 488 if (ok) { 489 /* Check to see if the ST represents an expression or not. */ 490 res = (self->st_type == PyST_EXPR) ? Py_False : Py_True; 491 Py_INCREF(res); 492 } 493 return (res); 494 } 495 496 497 #define PUBLIC_METHOD_TYPE (METH_VARARGS|METH_KEYWORDS) 498 499 static PyMethodDef 500 parser_methods[] = { 501 {"compile", (PyCFunction)parser_compilest, PUBLIC_METHOD_TYPE, 502 PyDoc_STR("Compile this ST object into a code object.")}, 503 {"isexpr", (PyCFunction)parser_isexpr, PUBLIC_METHOD_TYPE, 504 PyDoc_STR("Determines if this ST object was created from an expression.")}, 505 {"issuite", (PyCFunction)parser_issuite, PUBLIC_METHOD_TYPE, 506 PyDoc_STR("Determines if this ST object was created from a suite.")}, 507 {"tolist", (PyCFunction)parser_st2list, PUBLIC_METHOD_TYPE, 508 PyDoc_STR("Creates a list-tree representation of this ST.")}, 509 {"totuple", (PyCFunction)parser_st2tuple, PUBLIC_METHOD_TYPE, 510 PyDoc_STR("Creates a tuple-tree representation of this ST.")}, 511 512 {NULL, NULL, 0, NULL} 513 }; 514 515 516 static PyObject* 517 parser_getattr(PyObject *self, char *name) 518 { 519 return (Py_FindMethod(parser_methods, self, name)); 520 } 521 522 523 /* err_string(char* message) 524 * 525 * Sets the error string for an exception of type ParserError. 526 * 527 */ 528 static void 529 err_string(char *message) 530 { 531 PyErr_SetString(parser_error, message); 532 } 533 534 535 /* PyObject* parser_do_parse(PyObject* args, int type) 536 * 537 * Internal function to actually execute the parse and return the result if 538 * successful or set an exception if not. 539 * 540 */ 541 static PyObject* 542 parser_do_parse(PyObject *args, PyObject *kw, char *argspec, int type) 543 { 544 char* string = 0; 545 PyObject* res = 0; 546 int flags = 0; 547 perrdetail err; 548 549 static char *keywords[] = {"source", NULL}; 550 551 if (PyArg_ParseTupleAndKeywords(args, kw, argspec, keywords, &string)) { 552 node* n = PyParser_ParseStringFlagsFilenameEx(string, NULL, 553 &_PyParser_Grammar, 554 (type == PyST_EXPR) 555 ? eval_input : file_input, 556 &err, &flags); 557 558 if (n) { 559 res = parser_newstobject(n, type); 560 if (res) 561 ((PyST_Object *)res)->st_flags.cf_flags = flags & PyCF_MASK; 562 } 563 else 564 PyParser_SetError(&err); 565 } 566 return (res); 567 } 568 569 570 /* PyObject* parser_expr(PyObject* self, PyObject* args) 571 * PyObject* parser_suite(PyObject* self, PyObject* args) 572 * 573 * External interfaces to the parser itself. Which is called determines if 574 * the parser attempts to recognize an expression ('eval' form) or statement 575 * suite ('exec' form). The real work is done by parser_do_parse() above. 576 * 577 */ 578 static PyObject* 579 parser_expr(PyST_Object *self, PyObject *args, PyObject *kw) 580 { 581 NOTE(ARGUNUSED(self)) 582 return (parser_do_parse(args, kw, "s:expr", PyST_EXPR)); 583 } 584 585 586 static PyObject* 587 parser_suite(PyST_Object *self, PyObject *args, PyObject *kw) 588 { 589 NOTE(ARGUNUSED(self)) 590 return (parser_do_parse(args, kw, "s:suite", PyST_SUITE)); 591 } 592 593 594 595 /* This is the messy part of the code. Conversion from a tuple to an ST 596 * object requires that the input tuple be valid without having to rely on 597 * catching an exception from the compiler. This is done to allow the 598 * compiler itself to remain fast, since most of its input will come from 599 * the parser directly, and therefore be known to be syntactically correct. 600 * This validation is done to ensure that we don't core dump the compile 601 * phase, returning an exception instead. 602 * 603 * Two aspects can be broken out in this code: creating a node tree from 604 * the tuple passed in, and verifying that it is indeed valid. It may be 605 * advantageous to expand the number of ST types to include funcdefs and 606 * lambdadefs to take advantage of the optimizer, recognizing those STs 607 * here. They are not necessary, and not quite as useful in a raw form. 608 * For now, let's get expressions and suites working reliably. 609 */ 610 611 612 static node* build_node_tree(PyObject *tuple); 613 static int validate_expr_tree(node *tree); 614 static int validate_file_input(node *tree); 615 static int validate_encoding_decl(node *tree); 616 617 /* PyObject* parser_tuple2st(PyObject* self, PyObject* args) 618 * 619 * This is the public function, called from the Python code. It receives a 620 * single tuple object from the caller, and creates an ST object if the 621 * tuple can be validated. It does this by checking the first code of the 622 * tuple, and, if acceptable, builds the internal representation. If this 623 * step succeeds, the internal representation is validated as fully as 624 * possible with the various validate_*() routines defined below. 625 * 626 * This function must be changed if support is to be added for PyST_FRAGMENT 627 * ST objects. 628 * 629 */ 630 static PyObject* 631 parser_tuple2st(PyST_Object *self, PyObject *args, PyObject *kw) 632 { 633 NOTE(ARGUNUSED(self)) 634 PyObject *st = 0; 635 PyObject *tuple; 636 node *tree; 637 638 static char *keywords[] = {"sequence", NULL}; 639 640 if (!PyArg_ParseTupleAndKeywords(args, kw, "O:sequence2st", keywords, 641 &tuple)) 642 return (0); 643 if (!PySequence_Check(tuple)) { 644 PyErr_SetString(PyExc_ValueError, 645 "sequence2st() requires a single sequence argument"); 646 return (0); 647 } 648 /* 649 * Convert the tree to the internal form before checking it. 650 */ 651 tree = build_node_tree(tuple); 652 if (tree != 0) { 653 int start_sym = TYPE(tree); 654 if (start_sym == eval_input) { 655 /* Might be an eval form. */ 656 if (validate_expr_tree(tree)) 657 st = parser_newstobject(tree, PyST_EXPR); 658 else 659 PyNode_Free(tree); 660 } 661 else if (start_sym == file_input) { 662 /* This looks like an exec form so far. */ 663 if (validate_file_input(tree)) 664 st = parser_newstobject(tree, PyST_SUITE); 665 else 666 PyNode_Free(tree); 667 } 668 else if (start_sym == encoding_decl) { 669 /* This looks like an encoding_decl so far. */ 670 if (validate_encoding_decl(tree)) 671 st = parser_newstobject(tree, PyST_SUITE); 672 else 673 PyNode_Free(tree); 674 } 675 else { 676 /* This is a fragment, at best. */ 677 PyNode_Free(tree); 678 err_string("parse tree does not use a valid start symbol"); 679 } 680 } 681 /* Make sure we throw an exception on all errors. We should never 682 * get this, but we'd do well to be sure something is done. 683 */ 684 if (st == NULL && !PyErr_Occurred()) 685 err_string("unspecified ST error occurred"); 686 687 return st; 688 } 689 690 static PyObject* 691 parser_tuple2ast(PyST_Object *self, PyObject *args, PyObject *kw) 692 { 693 if (PyErr_WarnPy3k("tuple2ast is removed in 3.x; use tuple2st", 1) < 0) 694 return NULL; 695 return parser_tuple2st(self, args, kw); 696 } 697 698 699 /* node* build_node_children() 700 * 701 * Iterate across the children of the current non-terminal node and build 702 * their structures. If successful, return the root of this portion of 703 * the tree, otherwise, 0. Any required exception will be specified already, 704 * and no memory will have been deallocated. 705 * 706 */ 707 static node* 708 build_node_children(PyObject *tuple, node *root, int *line_num) 709 { 710 Py_ssize_t len = PyObject_Size(tuple); 711 Py_ssize_t i; 712 int err; 713 714 for (i = 1; i < len; ++i) { 715 /* elem must always be a sequence, however simple */ 716 PyObject* elem = PySequence_GetItem(tuple, i); 717 int ok = elem != NULL; 718 long type = 0; 719 char *strn = 0; 720 721 if (ok) 722 ok = PySequence_Check(elem); 723 if (ok) { 724 PyObject *temp = PySequence_GetItem(elem, 0); 725 if (temp == NULL) 726 ok = 0; 727 else { 728 ok = PyInt_Check(temp); 729 if (ok) 730 type = PyInt_AS_LONG(temp); 731 Py_DECREF(temp); 732 } 733 } 734 if (!ok) { 735 PyObject *err = Py_BuildValue("os", elem, 736 "Illegal node construct."); 737 PyErr_SetObject(parser_error, err); 738 Py_XDECREF(err); 739 Py_XDECREF(elem); 740 return (0); 741 } 742 if (ISTERMINAL(type)) { 743 Py_ssize_t len = PyObject_Size(elem); 744 PyObject *temp; 745 746 if ((len != 2) && (len != 3)) { 747 err_string("terminal nodes must have 2 or 3 entries"); 748 return 0; 749 } 750 temp = PySequence_GetItem(elem, 1); 751 if (temp == NULL) 752 return 0; 753 if (!PyString_Check(temp)) { 754 PyErr_Format(parser_error, 755 "second item in terminal node must be a string," 756 " found %s", 757 Py_TYPE(temp)->tp_name); 758 Py_DECREF(temp); 759 return 0; 760 } 761 if (len == 3) { 762 PyObject *o = PySequence_GetItem(elem, 2); 763 if (o != NULL) { 764 if (PyInt_Check(o)) 765 *line_num = PyInt_AS_LONG(o); 766 else { 767 PyErr_Format(parser_error, 768 "third item in terminal node must be an" 769 " integer, found %s", 770 Py_TYPE(temp)->tp_name); 771 Py_DECREF(o); 772 Py_DECREF(temp); 773 return 0; 774 } 775 Py_DECREF(o); 776 } 777 } 778 len = PyString_GET_SIZE(temp) + 1; 779 strn = (char *)PyObject_MALLOC(len); 780 if (strn != NULL) 781 (void) memcpy(strn, PyString_AS_STRING(temp), len); 782 Py_DECREF(temp); 783 } 784 else if (!ISNONTERMINAL(type)) { 785 /* 786 * It has to be one or the other; this is an error. 787 * Throw an exception. 788 */ 789 PyObject *err = Py_BuildValue("os", elem, "unknown node type."); 790 PyErr_SetObject(parser_error, err); 791 Py_XDECREF(err); 792 Py_XDECREF(elem); 793 return (0); 794 } 795 err = PyNode_AddChild(root, type, strn, *line_num, 0); 796 if (err == E_NOMEM) { 797 PyObject_FREE(strn); 798 return (node *) PyErr_NoMemory(); 799 } 800 if (err == E_OVERFLOW) { 801 PyObject_FREE(strn); 802 PyErr_SetString(PyExc_ValueError, 803 "unsupported number of child nodes"); 804 return NULL; 805 } 806 807 if (ISNONTERMINAL(type)) { 808 node* new_child = CHILD(root, i - 1); 809 810 if (new_child != build_node_children(elem, new_child, line_num)) { 811 Py_XDECREF(elem); 812 return (0); 813 } 814 } 815 else if (type == NEWLINE) { /* It's true: we increment the */ 816 ++(*line_num); /* line number *after* the newline! */ 817 } 818 Py_XDECREF(elem); 819 } 820 return root; 821 } 822 823 824 static node* 825 build_node_tree(PyObject *tuple) 826 { 827 node* res = 0; 828 PyObject *temp = PySequence_GetItem(tuple, 0); 829 long num = -1; 830 831 if (temp != NULL) 832 num = PyInt_AsLong(temp); 833 Py_XDECREF(temp); 834 if (ISTERMINAL(num)) { 835 /* 836 * The tuple is simple, but it doesn't start with a start symbol. 837 * Throw an exception now and be done with it. 838 */ 839 tuple = Py_BuildValue("os", tuple, 840 "Illegal syntax-tree; cannot start with terminal symbol."); 841 PyErr_SetObject(parser_error, tuple); 842 Py_XDECREF(tuple); 843 } 844 else if (ISNONTERMINAL(num)) { 845 /* 846 * Not efficient, but that can be handled later. 847 */ 848 int line_num = 0; 849 PyObject *encoding = NULL; 850 851 if (num == encoding_decl) { 852 encoding = PySequence_GetItem(tuple, 2); 853 /* tuple isn't borrowed anymore here, need to DECREF */ 854 tuple = PySequence_GetSlice(tuple, 0, 2); 855 } 856 res = PyNode_New(num); 857 if (res != NULL) { 858 if (res != build_node_children(tuple, res, &line_num)) { 859 PyNode_Free(res); 860 res = NULL; 861 } 862 if (res && encoding) { 863 Py_ssize_t len; 864 len = PyString_GET_SIZE(encoding) + 1; 865 res->n_str = (char *)PyObject_MALLOC(len); 866 if (res->n_str != NULL) 867 (void) memcpy(res->n_str, PyString_AS_STRING(encoding), len); 868 Py_DECREF(encoding); 869 Py_DECREF(tuple); 870 } 871 } 872 } 873 else { 874 /* The tuple is illegal -- if the number is neither TERMINAL nor 875 * NONTERMINAL, we can't use it. Not sure the implementation 876 * allows this condition, but the API doesn't preclude it. 877 */ 878 PyObject *err = Py_BuildValue("os", tuple, 879 "Illegal component tuple."); 880 PyErr_SetObject(parser_error, err); 881 Py_XDECREF(err); 882 } 883 884 return (res); 885 } 886 887 888 /* 889 * Validation routines used within the validation section: 890 */ 891 static int validate_terminal(node *terminal, int type, char *string); 892 893 #define validate_ampersand(ch) validate_terminal(ch, AMPER, "&") 894 #define validate_circumflex(ch) validate_terminal(ch, CIRCUMFLEX, "^") 895 #define validate_colon(ch) validate_terminal(ch, COLON, ":") 896 #define validate_comma(ch) validate_terminal(ch, COMMA, ",") 897 #define validate_dedent(ch) validate_terminal(ch, DEDENT, "") 898 #define validate_equal(ch) validate_terminal(ch, EQUAL, "=") 899 #define validate_indent(ch) validate_terminal(ch, INDENT, (char*)NULL) 900 #define validate_lparen(ch) validate_terminal(ch, LPAR, "(") 901 #define validate_newline(ch) validate_terminal(ch, NEWLINE, (char*)NULL) 902 #define validate_rparen(ch) validate_terminal(ch, RPAR, ")") 903 #define validate_semi(ch) validate_terminal(ch, SEMI, ";") 904 #define validate_star(ch) validate_terminal(ch, STAR, "*") 905 #define validate_vbar(ch) validate_terminal(ch, VBAR, "|") 906 #define validate_doublestar(ch) validate_terminal(ch, DOUBLESTAR, "**") 907 #define validate_dot(ch) validate_terminal(ch, DOT, ".") 908 #define validate_at(ch) validate_terminal(ch, AT, "@") 909 #define validate_name(ch, str) validate_terminal(ch, NAME, str) 910 911 #define VALIDATER(n) static int validate_##n(node *tree) 912 913 VALIDATER(node); VALIDATER(small_stmt); 914 VALIDATER(class); VALIDATER(node); 915 VALIDATER(parameters); VALIDATER(suite); 916 VALIDATER(testlist); VALIDATER(varargslist); 917 VALIDATER(fpdef); VALIDATER(fplist); 918 VALIDATER(stmt); VALIDATER(simple_stmt); 919 VALIDATER(expr_stmt); VALIDATER(power); 920 VALIDATER(print_stmt); VALIDATER(del_stmt); 921 VALIDATER(return_stmt); VALIDATER(list_iter); 922 VALIDATER(raise_stmt); VALIDATER(import_stmt); 923 VALIDATER(import_name); VALIDATER(import_from); 924 VALIDATER(global_stmt); VALIDATER(list_if); 925 VALIDATER(assert_stmt); VALIDATER(list_for); 926 VALIDATER(exec_stmt); VALIDATER(compound_stmt); 927 VALIDATER(while); VALIDATER(for); 928 VALIDATER(try); VALIDATER(except_clause); 929 VALIDATER(test); VALIDATER(and_test); 930 VALIDATER(not_test); VALIDATER(comparison); 931 VALIDATER(comp_op); VALIDATER(expr); 932 VALIDATER(xor_expr); VALIDATER(and_expr); 933 VALIDATER(shift_expr); VALIDATER(arith_expr); 934 VALIDATER(term); VALIDATER(factor); 935 VALIDATER(atom); VALIDATER(lambdef); 936 VALIDATER(trailer); VALIDATER(subscript); 937 VALIDATER(subscriptlist); VALIDATER(sliceop); 938 VALIDATER(exprlist); VALIDATER(dictorsetmaker); 939 VALIDATER(arglist); VALIDATER(argument); 940 VALIDATER(listmaker); VALIDATER(yield_stmt); 941 VALIDATER(testlist1); VALIDATER(comp_for); 942 VALIDATER(comp_iter); VALIDATER(comp_if); 943 VALIDATER(testlist_comp); VALIDATER(yield_expr); 944 VALIDATER(yield_or_testlist); VALIDATER(or_test); 945 VALIDATER(old_test); VALIDATER(old_lambdef); 946 947 #undef VALIDATER 948 949 #define is_even(n) (((n) & 1) == 0) 950 #define is_odd(n) (((n) & 1) == 1) 951 952 953 static int 954 validate_ntype(node *n, int t) 955 { 956 if (TYPE(n) != t) { 957 PyErr_Format(parser_error, "Expected node type %d, got %d.", 958 t, TYPE(n)); 959 return 0; 960 } 961 return 1; 962 } 963 964 965 /* Verifies that the number of child nodes is exactly 'num', raising 966 * an exception if it isn't. The exception message does not indicate 967 * the exact number of nodes, allowing this to be used to raise the 968 * "right" exception when the wrong number of nodes is present in a 969 * specific variant of a statement's syntax. This is commonly used 970 * in that fashion. 971 */ 972 static int 973 validate_numnodes(node *n, int num, const char *const name) 974 { 975 if (NCH(n) != num) { 976 PyErr_Format(parser_error, 977 "Illegal number of children for %s node.", name); 978 return 0; 979 } 980 return 1; 981 } 982 983 984 static int 985 validate_terminal(node *terminal, int type, char *string) 986 { 987 int res = (validate_ntype(terminal, type) 988 && ((string == 0) || (strcmp(string, STR(terminal)) == 0))); 989 990 if (!res && !PyErr_Occurred()) { 991 PyErr_Format(parser_error, 992 "Illegal terminal: expected \"%s\"", string); 993 } 994 return (res); 995 } 996 997 998 /* X (',' X) [','] 999 */ 1000 static int 1001 validate_repeating_list(node *tree, int ntype, int (*vfunc)(node *), 1002 const char *const name) 1003 { 1004 int nch = NCH(tree); 1005 int res = (nch && validate_ntype(tree, ntype) 1006 && vfunc(CHILD(tree, 0))); 1007 1008 if (!res && !PyErr_Occurred()) 1009 (void) validate_numnodes(tree, 1, name); 1010 else { 1011 if (is_even(nch)) 1012 res = validate_comma(CHILD(tree, --nch)); 1013 if (res && nch > 1) { 1014 int pos = 1; 1015 for ( ; res && pos < nch; pos += 2) 1016 res = (validate_comma(CHILD(tree, pos)) 1017 && vfunc(CHILD(tree, pos + 1))); 1018 } 1019 } 1020 return (res); 1021 } 1022 1023 1024 /* validate_class() 1025 * 1026 * classdef: 1027 * 'class' NAME ['(' testlist ')'] ':' suite 1028 */ 1029 static int 1030 validate_class(node *tree) 1031 { 1032 int nch = NCH(tree); 1033 int res = (validate_ntype(tree, classdef) && 1034 ((nch == 4) || (nch == 6) || (nch == 7))); 1035 1036 if (res) { 1037 res = (validate_name(CHILD(tree, 0), "class") 1038 && validate_ntype(CHILD(tree, 1), NAME) 1039 && validate_colon(CHILD(tree, nch - 2)) 1040 && validate_suite(CHILD(tree, nch - 1))); 1041 } 1042 else { 1043 (void) validate_numnodes(tree, 4, "class"); 1044 } 1045 1046 if (res) { 1047 if (nch == 7) { 1048 res = ((validate_lparen(CHILD(tree, 2)) && 1049 validate_testlist(CHILD(tree, 3)) && 1050 validate_rparen(CHILD(tree, 4)))); 1051 } 1052 else if (nch == 6) { 1053 res = (validate_lparen(CHILD(tree,2)) && 1054 validate_rparen(CHILD(tree,3))); 1055 } 1056 } 1057 return (res); 1058 } 1059 1060 1061 /* if_stmt: 1062 * 'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite] 1063 */ 1064 static int 1065 validate_if(node *tree) 1066 { 1067 int nch = NCH(tree); 1068 int res = (validate_ntype(tree, if_stmt) 1069 && (nch >= 4) 1070 && validate_name(CHILD(tree, 0), "if") 1071 && validate_test(CHILD(tree, 1)) 1072 && validate_colon(CHILD(tree, 2)) 1073 && validate_suite(CHILD(tree, 3))); 1074 1075 if (res && ((nch % 4) == 3)) { 1076 /* ... 'else' ':' suite */ 1077 res = (validate_name(CHILD(tree, nch - 3), "else") 1078 && validate_colon(CHILD(tree, nch - 2)) 1079 && validate_suite(CHILD(tree, nch - 1))); 1080 nch -= 3; 1081 } 1082 else if (!res && !PyErr_Occurred()) 1083 (void) validate_numnodes(tree, 4, "if"); 1084 if ((nch % 4) != 0) 1085 /* Will catch the case for nch < 4 */ 1086 res = validate_numnodes(tree, 0, "if"); 1087 else if (res && (nch > 4)) { 1088 /* ... ('elif' test ':' suite)+ ... */ 1089 int j = 4; 1090 while ((j < nch) && res) { 1091 res = (validate_name(CHILD(tree, j), "elif") 1092 && validate_colon(CHILD(tree, j + 2)) 1093 && validate_test(CHILD(tree, j + 1)) 1094 && validate_suite(CHILD(tree, j + 3))); 1095 j += 4; 1096 } 1097 } 1098 return (res); 1099 } 1100 1101 1102 /* parameters: 1103 * '(' [varargslist] ')' 1104 * 1105 */ 1106 static int 1107 validate_parameters(node *tree) 1108 { 1109 int nch = NCH(tree); 1110 int res = validate_ntype(tree, parameters) && ((nch == 2) || (nch == 3)); 1111 1112 if (res) { 1113 res = (validate_lparen(CHILD(tree, 0)) 1114 && validate_rparen(CHILD(tree, nch - 1))); 1115 if (res && (nch == 3)) 1116 res = validate_varargslist(CHILD(tree, 1)); 1117 } 1118 else { 1119 (void) validate_numnodes(tree, 2, "parameters"); 1120 } 1121 return (res); 1122 } 1123 1124 1125 /* validate_suite() 1126 * 1127 * suite: 1128 * simple_stmt 1129 * | NEWLINE INDENT stmt+ DEDENT 1130 */ 1131 static int 1132 validate_suite(node *tree) 1133 { 1134 int nch = NCH(tree); 1135 int res = (validate_ntype(tree, suite) && ((nch == 1) || (nch >= 4))); 1136 1137 if (res && (nch == 1)) 1138 res = validate_simple_stmt(CHILD(tree, 0)); 1139 else if (res) { 1140 /* NEWLINE INDENT stmt+ DEDENT */ 1141 res = (validate_newline(CHILD(tree, 0)) 1142 && validate_indent(CHILD(tree, 1)) 1143 && validate_stmt(CHILD(tree, 2)) 1144 && validate_dedent(CHILD(tree, nch - 1))); 1145 1146 if (res && (nch > 4)) { 1147 int i = 3; 1148 --nch; /* forget the DEDENT */ 1149 for ( ; res && (i < nch); ++i) 1150 res = validate_stmt(CHILD(tree, i)); 1151 } 1152 else if (nch < 4) 1153 res = validate_numnodes(tree, 4, "suite"); 1154 } 1155 return (res); 1156 } 1157 1158 1159 static int 1160 validate_testlist(node *tree) 1161 { 1162 return (validate_repeating_list(tree, testlist, 1163 validate_test, "testlist")); 1164 } 1165 1166 1167 static int 1168 validate_testlist1(node *tree) 1169 { 1170 return (validate_repeating_list(tree, testlist1, 1171 validate_test, "testlist1")); 1172 } 1173 1174 1175 static int 1176 validate_testlist_safe(node *tree) 1177 { 1178 return (validate_repeating_list(tree, testlist_safe, 1179 validate_old_test, "testlist_safe")); 1180 } 1181 1182 1183 /* '*' NAME [',' '**' NAME] | '**' NAME 1184 */ 1185 static int 1186 validate_varargslist_trailer(node *tree, int start) 1187 { 1188 int nch = NCH(tree); 1189 int res = 0; 1190 int sym; 1191 1192 if (nch <= start) { 1193 err_string("expected variable argument trailer for varargslist"); 1194 return 0; 1195 } 1196 sym = TYPE(CHILD(tree, start)); 1197 if (sym == STAR) { 1198 /* 1199 * ('*' NAME [',' '**' NAME] 1200 */ 1201 if (nch-start == 2) 1202 res = validate_name(CHILD(tree, start+1), NULL); 1203 else if (nch-start == 5) 1204 res = (validate_name(CHILD(tree, start+1), NULL) 1205 && validate_comma(CHILD(tree, start+2)) 1206 && validate_doublestar(CHILD(tree, start+3)) 1207 && validate_name(CHILD(tree, start+4), NULL)); 1208 } 1209 else if (sym == DOUBLESTAR) { 1210 /* 1211 * '**' NAME 1212 */ 1213 if (nch-start == 2) 1214 res = validate_name(CHILD(tree, start+1), NULL); 1215 } 1216 if (!res) 1217 err_string("illegal variable argument trailer for varargslist"); 1218 return res; 1219 } 1220 1221 1222 /* validate_varargslist() 1223 * 1224 * varargslist: 1225 * (fpdef ['=' test] ',')* 1226 * ('*' NAME [',' '**' NAME] 1227 * | '**' NAME) 1228 * | fpdef ['=' test] (',' fpdef ['=' test])* [','] 1229 * 1230 */ 1231 static int 1232 validate_varargslist(node *tree) 1233 { 1234 int nch = NCH(tree); 1235 int res = validate_ntype(tree, varargslist) && (nch != 0); 1236 int sym; 1237 1238 if (!res) 1239 return 0; 1240 if (nch < 1) { 1241 err_string("varargslist missing child nodes"); 1242 return 0; 1243 } 1244 sym = TYPE(CHILD(tree, 0)); 1245 if (sym == STAR || sym == DOUBLESTAR) 1246 /* whole thing matches: 1247 * '*' NAME [',' '**' NAME] | '**' NAME 1248 */ 1249 res = validate_varargslist_trailer(tree, 0); 1250 else if (sym == fpdef) { 1251 int i = 0; 1252 1253 sym = TYPE(CHILD(tree, nch-1)); 1254 if (sym == NAME) { 1255 /* 1256 * (fpdef ['=' test] ',')+ 1257 * ('*' NAME [',' '**' NAME] 1258 * | '**' NAME) 1259 */ 1260 /* skip over (fpdef ['=' test] ',')+ */ 1261 while (res && (i+2 <= nch)) { 1262 res = validate_fpdef(CHILD(tree, i)); 1263 ++i; 1264 if (res && TYPE(CHILD(tree, i)) == EQUAL && (i+2 <= nch)) { 1265 res = (validate_equal(CHILD(tree, i)) 1266 && validate_test(CHILD(tree, i+1))); 1267 if (res) 1268 i += 2; 1269 } 1270 if (res && i < nch) { 1271 res = validate_comma(CHILD(tree, i)); 1272 ++i; 1273 if (res && i < nch 1274 && (TYPE(CHILD(tree, i)) == DOUBLESTAR 1275 || TYPE(CHILD(tree, i)) == STAR)) 1276 break; 1277 } 1278 } 1279 /* ... '*' NAME [',' '**' NAME] | '**' NAME 1280 * i --^^^ 1281 */ 1282 if (res) 1283 res = validate_varargslist_trailer(tree, i); 1284 } 1285 else { 1286 /* 1287 * fpdef ['=' test] (',' fpdef ['=' test])* [','] 1288 */ 1289 /* strip trailing comma node */ 1290 if (sym == COMMA) { 1291 res = validate_comma(CHILD(tree, nch-1)); 1292 if (!res) 1293 return 0; 1294 --nch; 1295 } 1296 /* 1297 * fpdef ['=' test] (',' fpdef ['=' test])* 1298 */ 1299 res = validate_fpdef(CHILD(tree, 0)); 1300 ++i; 1301 if (res && (i+2 <= nch) && TYPE(CHILD(tree, i)) == EQUAL) { 1302 res = (validate_equal(CHILD(tree, i)) 1303 && validate_test(CHILD(tree, i+1))); 1304 i += 2; 1305 } 1306 /* 1307 * ... (',' fpdef ['=' test])* 1308 * i ---^^^ 1309 */ 1310 while (res && (nch - i) >= 2) { 1311 res = (validate_comma(CHILD(tree, i)) 1312 && validate_fpdef(CHILD(tree, i+1))); 1313 i += 2; 1314 if (res && (nch - i) >= 2 && TYPE(CHILD(tree, i)) == EQUAL) { 1315 res = (validate_equal(CHILD(tree, i)) 1316 && validate_test(CHILD(tree, i+1))); 1317 i += 2; 1318 } 1319 } 1320 if (res && nch - i != 0) { 1321 res = 0; 1322 err_string("illegal formation for varargslist"); 1323 } 1324 } 1325 } 1326 return res; 1327 } 1328 1329 1330 /* list_iter: list_for | list_if 1331 */ 1332 static int 1333 validate_list_iter(node *tree) 1334 { 1335 int res = (validate_ntype(tree, list_iter) 1336 && validate_numnodes(tree, 1, "list_iter")); 1337 if (res && TYPE(CHILD(tree, 0)) == list_for) 1338 res = validate_list_for(CHILD(tree, 0)); 1339 else 1340 res = validate_list_if(CHILD(tree, 0)); 1341 1342 return res; 1343 } 1344 1345 /* comp_iter: comp_for | comp_if 1346 */ 1347 static int 1348 validate_comp_iter(node *tree) 1349 { 1350 int res = (validate_ntype(tree, comp_iter) 1351 && validate_numnodes(tree, 1, "comp_iter")); 1352 if (res && TYPE(CHILD(tree, 0)) == comp_for) 1353 res = validate_comp_for(CHILD(tree, 0)); 1354 else 1355 res = validate_comp_if(CHILD(tree, 0)); 1356 1357 return res; 1358 } 1359 1360 /* list_for: 'for' exprlist 'in' testlist [list_iter] 1361 */ 1362 static int 1363 validate_list_for(node *tree) 1364 { 1365 int nch = NCH(tree); 1366 int res; 1367 1368 if (nch == 5) 1369 res = validate_list_iter(CHILD(tree, 4)); 1370 else 1371 res = validate_numnodes(tree, 4, "list_for"); 1372 1373 if (res) 1374 res = (validate_name(CHILD(tree, 0), "for") 1375 && validate_exprlist(CHILD(tree, 1)) 1376 && validate_name(CHILD(tree, 2), "in") 1377 && validate_testlist_safe(CHILD(tree, 3))); 1378 1379 return res; 1380 } 1381 1382 /* comp_for: 'for' exprlist 'in' test [comp_iter] 1383 */ 1384 static int 1385 validate_comp_for(node *tree) 1386 { 1387 int nch = NCH(tree); 1388 int res; 1389 1390 if (nch == 5) 1391 res = validate_comp_iter(CHILD(tree, 4)); 1392 else 1393 res = validate_numnodes(tree, 4, "comp_for"); 1394 1395 if (res) 1396 res = (validate_name(CHILD(tree, 0), "for") 1397 && validate_exprlist(CHILD(tree, 1)) 1398 && validate_name(CHILD(tree, 2), "in") 1399 && validate_or_test(CHILD(tree, 3))); 1400 1401 return res; 1402 } 1403 1404 /* list_if: 'if' old_test [list_iter] 1405 */ 1406 static int 1407 validate_list_if(node *tree) 1408 { 1409 int nch = NCH(tree); 1410 int res; 1411 1412 if (nch == 3) 1413 res = validate_list_iter(CHILD(tree, 2)); 1414 else 1415 res = validate_numnodes(tree, 2, "list_if"); 1416 1417 if (res) 1418 res = (validate_name(CHILD(tree, 0), "if") 1419 && validate_old_test(CHILD(tree, 1))); 1420 1421 return res; 1422 } 1423 1424 /* comp_if: 'if' old_test [comp_iter] 1425 */ 1426 static int 1427 validate_comp_if(node *tree) 1428 { 1429 int nch = NCH(tree); 1430 int res; 1431 1432 if (nch == 3) 1433 res = validate_comp_iter(CHILD(tree, 2)); 1434 else 1435 res = validate_numnodes(tree, 2, "comp_if"); 1436 1437 if (res) 1438 res = (validate_name(CHILD(tree, 0), "if") 1439 && validate_old_test(CHILD(tree, 1))); 1440 1441 return res; 1442 } 1443 1444 /* validate_fpdef() 1445 * 1446 * fpdef: 1447 * NAME 1448 * | '(' fplist ')' 1449 */ 1450 static int 1451 validate_fpdef(node *tree) 1452 { 1453 int nch = NCH(tree); 1454 int res = validate_ntype(tree, fpdef); 1455 1456 if (res) { 1457 if (nch == 1) 1458 res = validate_ntype(CHILD(tree, 0), NAME); 1459 else if (nch == 3) 1460 res = (validate_lparen(CHILD(tree, 0)) 1461 && validate_fplist(CHILD(tree, 1)) 1462 && validate_rparen(CHILD(tree, 2))); 1463 else 1464 res = validate_numnodes(tree, 1, "fpdef"); 1465 } 1466 return (res); 1467 } 1468 1469 1470 static int 1471 validate_fplist(node *tree) 1472 { 1473 return (validate_repeating_list(tree, fplist, 1474 validate_fpdef, "fplist")); 1475 } 1476 1477 1478 /* simple_stmt | compound_stmt 1479 * 1480 */ 1481 static int 1482 validate_stmt(node *tree) 1483 { 1484 int res = (validate_ntype(tree, stmt) 1485 && validate_numnodes(tree, 1, "stmt")); 1486 1487 if (res) { 1488 tree = CHILD(tree, 0); 1489 1490 if (TYPE(tree) == simple_stmt) 1491 res = validate_simple_stmt(tree); 1492 else 1493 res = validate_compound_stmt(tree); 1494 } 1495 return (res); 1496 } 1497 1498 1499 /* small_stmt (';' small_stmt)* [';'] NEWLINE 1500 * 1501 */ 1502 static int 1503 validate_simple_stmt(node *tree) 1504 { 1505 int nch = NCH(tree); 1506 int res = (validate_ntype(tree, simple_stmt) 1507 && (nch >= 2) 1508 && validate_small_stmt(CHILD(tree, 0)) 1509 && validate_newline(CHILD(tree, nch - 1))); 1510 1511 if (nch < 2) 1512 res = validate_numnodes(tree, 2, "simple_stmt"); 1513 --nch; /* forget the NEWLINE */ 1514 if (res && is_even(nch)) 1515 res = validate_semi(CHILD(tree, --nch)); 1516 if (res && (nch > 2)) { 1517 int i; 1518 1519 for (i = 1; res && (i < nch); i += 2) 1520 res = (validate_semi(CHILD(tree, i)) 1521 && validate_small_stmt(CHILD(tree, i + 1))); 1522 } 1523 return (res); 1524 } 1525 1526 1527 static int 1528 validate_small_stmt(node *tree) 1529 { 1530 int nch = NCH(tree); 1531 int res = validate_numnodes(tree, 1, "small_stmt"); 1532 1533 if (res) { 1534 int ntype = TYPE(CHILD(tree, 0)); 1535 1536 if ( (ntype == expr_stmt) 1537 || (ntype == print_stmt) 1538 || (ntype == del_stmt) 1539 || (ntype == pass_stmt) 1540 || (ntype == flow_stmt) 1541 || (ntype == import_stmt) 1542 || (ntype == global_stmt) 1543 || (ntype == assert_stmt) 1544 || (ntype == exec_stmt)) 1545 res = validate_node(CHILD(tree, 0)); 1546 else { 1547 res = 0; 1548 err_string("illegal small_stmt child type"); 1549 } 1550 } 1551 else if (nch == 1) { 1552 res = 0; 1553 PyErr_Format(parser_error, 1554 "Unrecognized child node of small_stmt: %d.", 1555 TYPE(CHILD(tree, 0))); 1556 } 1557 return (res); 1558 } 1559 1560 1561 /* compound_stmt: 1562 * if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated 1563 */ 1564 static int 1565 validate_compound_stmt(node *tree) 1566 { 1567 int res = (validate_ntype(tree, compound_stmt) 1568 && validate_numnodes(tree, 1, "compound_stmt")); 1569 int ntype; 1570 1571 if (!res) 1572 return (0); 1573 1574 tree = CHILD(tree, 0); 1575 ntype = TYPE(tree); 1576 if ( (ntype == if_stmt) 1577 || (ntype == while_stmt) 1578 || (ntype == for_stmt) 1579 || (ntype == try_stmt) 1580 || (ntype == with_stmt) 1581 || (ntype == funcdef) 1582 || (ntype == classdef) 1583 || (ntype == decorated)) 1584 res = validate_node(tree); 1585 else { 1586 res = 0; 1587 PyErr_Format(parser_error, 1588 "Illegal compound statement type: %d.", TYPE(tree)); 1589 } 1590 return (res); 1591 } 1592 1593 static int 1594 validate_yield_or_testlist(node *tree) 1595 { 1596 if (TYPE(tree) == yield_expr) 1597 return validate_yield_expr(tree); 1598 else 1599 return validate_testlist(tree); 1600 } 1601 1602 static int 1603 validate_expr_stmt(node *tree) 1604 { 1605 int j; 1606 int nch = NCH(tree); 1607 int res = (validate_ntype(tree, expr_stmt) 1608 && is_odd(nch) 1609 && validate_testlist(CHILD(tree, 0))); 1610 1611 if (res && nch == 3 1612 && TYPE(CHILD(tree, 1)) == augassign) { 1613 res = validate_numnodes(CHILD(tree, 1), 1, "augassign") 1614 && validate_yield_or_testlist(CHILD(tree, 2)); 1615 1616 if (res) { 1617 char *s = STR(CHILD(CHILD(tree, 1), 0)); 1618 1619 res = (strcmp(s, "+=") == 0 1620 || strcmp(s, "-=") == 0 1621 || strcmp(s, "*=") == 0 1622 || strcmp(s, "/=") == 0 1623 || strcmp(s, "//=") == 0 1624 || strcmp(s, "%=") == 0 1625 || strcmp(s, "&=") == 0 1626 || strcmp(s, "|=") == 0 1627 || strcmp(s, "^=") == 0 1628 || strcmp(s, "<<=") == 0 1629 || strcmp(s, ">>=") == 0 1630 || strcmp(s, "**=") == 0); 1631 if (!res) 1632 err_string("illegal augmented assignment operator"); 1633 } 1634 } 1635 else { 1636 for (j = 1; res && (j < nch); j += 2) 1637 res = validate_equal(CHILD(tree, j)) 1638 && validate_yield_or_testlist(CHILD(tree, j + 1)); 1639 } 1640 return (res); 1641 } 1642 1643 1644 /* print_stmt: 1645 * 1646 * 'print' ( [ test (',' test)* [','] ] 1647 * | '>>' test [ (',' test)+ [','] ] ) 1648 */ 1649 static int 1650 validate_print_stmt(node *tree) 1651 { 1652 int nch = NCH(tree); 1653 int res = (validate_ntype(tree, print_stmt) 1654 && (nch > 0) 1655 && validate_name(CHILD(tree, 0), "print")); 1656 1657 if (res && nch > 1) { 1658 int sym = TYPE(CHILD(tree, 1)); 1659 int i = 1; 1660 int allow_trailing_comma = 1; 1661 1662 if (sym == test) 1663 res = validate_test(CHILD(tree, i++)); 1664 else { 1665 if (nch < 3) 1666 res = validate_numnodes(tree, 3, "print_stmt"); 1667 else { 1668 res = (validate_ntype(CHILD(tree, i), RIGHTSHIFT) 1669 && validate_test(CHILD(tree, i+1))); 1670 i += 2; 1671 allow_trailing_comma = 0; 1672 } 1673 } 1674 if (res) { 1675 /* ... (',' test)* [','] */ 1676 while (res && i+2 <= nch) { 1677 res = (validate_comma(CHILD(tree, i)) 1678 && validate_test(CHILD(tree, i+1))); 1679 allow_trailing_comma = 1; 1680 i += 2; 1681 } 1682 if (res && !allow_trailing_comma) 1683 res = validate_numnodes(tree, i, "print_stmt"); 1684 else if (res && i < nch) 1685 res = validate_comma(CHILD(tree, i)); 1686 } 1687 } 1688 return (res); 1689 } 1690 1691 1692 static int 1693 validate_del_stmt(node *tree) 1694 { 1695 return (validate_numnodes(tree, 2, "del_stmt") 1696 && validate_name(CHILD(tree, 0), "del") 1697 && validate_exprlist(CHILD(tree, 1))); 1698 } 1699 1700 1701 static int 1702 validate_return_stmt(node *tree) 1703 { 1704 int nch = NCH(tree); 1705 int res = (validate_ntype(tree, return_stmt) 1706 && ((nch == 1) || (nch == 2)) 1707 && validate_name(CHILD(tree, 0), "return")); 1708 1709 if (res && (nch == 2)) 1710 res = validate_testlist(CHILD(tree, 1)); 1711 1712 return (res); 1713 } 1714 1715 1716 static int 1717 validate_raise_stmt(node *tree) 1718 { 1719 int nch = NCH(tree); 1720 int res = (validate_ntype(tree, raise_stmt) 1721 && ((nch == 1) || (nch == 2) || (nch == 4) || (nch == 6))); 1722 1723 if (res) { 1724 res = validate_name(CHILD(tree, 0), "raise"); 1725 if (res && (nch >= 2)) 1726 res = validate_test(CHILD(tree, 1)); 1727 if (res && nch > 2) { 1728 res = (validate_comma(CHILD(tree, 2)) 1729 && validate_test(CHILD(tree, 3))); 1730 if (res && (nch > 4)) 1731 res = (validate_comma(CHILD(tree, 4)) 1732 && validate_test(CHILD(tree, 5))); 1733 } 1734 } 1735 else 1736 (void) validate_numnodes(tree, 2, "raise"); 1737 if (res && (nch == 4)) 1738 res = (validate_comma(CHILD(tree, 2)) 1739 && validate_test(CHILD(tree, 3))); 1740 1741 return (res); 1742 } 1743 1744 1745 /* yield_expr: 'yield' [testlist] 1746 */ 1747 static int 1748 validate_yield_expr(node *tree) 1749 { 1750 int nch = NCH(tree); 1751 int res = (validate_ntype(tree, yield_expr) 1752 && ((nch == 1) || (nch == 2)) 1753 && validate_name(CHILD(tree, 0), "yield")); 1754 1755 if (res && (nch == 2)) 1756 res = validate_testlist(CHILD(tree, 1)); 1757 1758 return (res); 1759 } 1760 1761 1762 /* yield_stmt: yield_expr 1763 */ 1764 static int 1765 validate_yield_stmt(node *tree) 1766 { 1767 return (validate_ntype(tree, yield_stmt) 1768 && validate_numnodes(tree, 1, "yield_stmt") 1769 && validate_yield_expr(CHILD(tree, 0))); 1770 } 1771 1772 1773 static int 1774 validate_import_as_name(node *tree) 1775 { 1776 int nch = NCH(tree); 1777 int ok = validate_ntype(tree, import_as_name); 1778 1779 if (ok) { 1780 if (nch == 1) 1781 ok = validate_name(CHILD(tree, 0), NULL); 1782 else if (nch == 3) 1783 ok = (validate_name(CHILD(tree, 0), NULL) 1784 && validate_name(CHILD(tree, 1), "as") 1785 && validate_name(CHILD(tree, 2), NULL)); 1786 else 1787 ok = validate_numnodes(tree, 3, "import_as_name"); 1788 } 1789 return ok; 1790 } 1791 1792 1793 /* dotted_name: NAME ("." NAME)* 1794 */ 1795 static int 1796 validate_dotted_name(node *tree) 1797 { 1798 int nch = NCH(tree); 1799 int res = (validate_ntype(tree, dotted_name) 1800 && is_odd(nch) 1801 && validate_name(CHILD(tree, 0), NULL)); 1802 int i; 1803 1804 for (i = 1; res && (i < nch); i += 2) { 1805 res = (validate_dot(CHILD(tree, i)) 1806 && validate_name(CHILD(tree, i+1), NULL)); 1807 } 1808 return res; 1809 } 1810 1811 1812 /* dotted_as_name: dotted_name [NAME NAME] 1813 */ 1814 static int 1815 validate_dotted_as_name(node *tree) 1816 { 1817 int nch = NCH(tree); 1818 int res = validate_ntype(tree, dotted_as_name); 1819 1820 if (res) { 1821 if (nch == 1) 1822 res = validate_dotted_name(CHILD(tree, 0)); 1823 else if (nch == 3) 1824 res = (validate_dotted_name(CHILD(tree, 0)) 1825 && validate_name(CHILD(tree, 1), "as") 1826 && validate_name(CHILD(tree, 2), NULL)); 1827 else { 1828 res = 0; 1829 err_string("illegal number of children for dotted_as_name"); 1830 } 1831 } 1832 return res; 1833 } 1834 1835 1836 /* dotted_as_name (',' dotted_as_name)* */ 1837 static int 1838 validate_dotted_as_names(node *tree) 1839 { 1840 int nch = NCH(tree); 1841 int res = is_odd(nch) && validate_dotted_as_name(CHILD(tree, 0)); 1842 int i; 1843 1844 for (i = 1; res && (i < nch); i += 2) 1845 res = (validate_comma(CHILD(tree, i)) 1846 && validate_dotted_as_name(CHILD(tree, i + 1))); 1847 return (res); 1848 } 1849 1850 1851 /* import_as_name (',' import_as_name)* [','] */ 1852 static int 1853 validate_import_as_names(node *tree) 1854 { 1855 int nch = NCH(tree); 1856 int res = validate_import_as_name(CHILD(tree, 0)); 1857 int i; 1858 1859 for (i = 1; res && (i + 1 < nch); i += 2) 1860 res = (validate_comma(CHILD(tree, i)) 1861 && validate_import_as_name(CHILD(tree, i + 1))); 1862 return (res); 1863 } 1864 1865 1866 /* 'import' dotted_as_names */ 1867 static int 1868 validate_import_name(node *tree) 1869 { 1870 return (validate_ntype(tree, import_name) 1871 && validate_numnodes(tree, 2, "import_name") 1872 && validate_name(CHILD(tree, 0), "import") 1873 && validate_dotted_as_names(CHILD(tree, 1))); 1874 } 1875 1876 /* Helper function to count the number of leading dots in 1877 * 'from ...module import name' 1878 */ 1879 static int 1880 count_from_dots(node *tree) 1881 { 1882 int i; 1883 for (i = 1; i < NCH(tree); i++) 1884 if (TYPE(CHILD(tree, i)) != DOT) 1885 break; 1886 return i-1; 1887 } 1888 1889 /* import_from: ('from' ('.'* dotted_name | '.'+) 1890 * 'import' ('*' | '(' import_as_names ')' | import_as_names)) 1891 */ 1892 static int 1893 validate_import_from(node *tree) 1894 { 1895 int nch = NCH(tree); 1896 int ndots = count_from_dots(tree); 1897 int havename = (TYPE(CHILD(tree, ndots + 1)) == dotted_name); 1898 int offset = ndots + havename; 1899 int res = validate_ntype(tree, import_from) 1900 && (offset >= 1) 1901 && (nch >= 3 + offset) 1902 && validate_name(CHILD(tree, 0), "from") 1903 && (!havename || validate_dotted_name(CHILD(tree, ndots + 1))) 1904 && validate_name(CHILD(tree, offset + 1), "import"); 1905 1906 if (res && TYPE(CHILD(tree, offset + 2)) == LPAR) 1907 res = ((nch == offset + 5) 1908 && validate_lparen(CHILD(tree, offset + 2)) 1909 && validate_import_as_names(CHILD(tree, offset + 3)) 1910 && validate_rparen(CHILD(tree, offset + 4))); 1911 else if (res && TYPE(CHILD(tree, offset + 2)) != STAR) 1912 res = validate_import_as_names(CHILD(tree, offset + 2)); 1913 return (res); 1914 } 1915 1916 1917 /* import_stmt: import_name | import_from */ 1918 static int 1919 validate_import_stmt(node *tree) 1920 { 1921 int nch = NCH(tree); 1922 int res = validate_numnodes(tree, 1, "import_stmt"); 1923 1924 if (res) { 1925 int ntype = TYPE(CHILD(tree, 0)); 1926 1927 if (ntype == import_name || ntype == import_from) 1928 res = validate_node(CHILD(tree, 0)); 1929 else { 1930 res = 0; 1931 err_string("illegal import_stmt child type"); 1932 } 1933 } 1934 else if (nch == 1) { 1935 res = 0; 1936 PyErr_Format(parser_error, 1937 "Unrecognized child node of import_stmt: %d.", 1938 TYPE(CHILD(tree, 0))); 1939 } 1940 return (res); 1941 } 1942 1943 1944 1945 1946 static int 1947 validate_global_stmt(node *tree) 1948 { 1949 int j; 1950 int nch = NCH(tree); 1951 int res = (validate_ntype(tree, global_stmt) 1952 && is_even(nch) && (nch >= 2)); 1953 1954 if (!res && !PyErr_Occurred()) 1955 err_string("illegal global statement"); 1956 1957 if (res) 1958 res = (validate_name(CHILD(tree, 0), "global") 1959 && validate_ntype(CHILD(tree, 1), NAME)); 1960 for (j = 2; res && (j < nch); j += 2) 1961 res = (validate_comma(CHILD(tree, j)) 1962 && validate_ntype(CHILD(tree, j + 1), NAME)); 1963 1964 return (res); 1965 } 1966 1967 1968 /* exec_stmt: 1969 * 1970 * 'exec' expr ['in' test [',' test]] 1971 */ 1972 static int 1973 validate_exec_stmt(node *tree) 1974 { 1975 int nch = NCH(tree); 1976 int res = (validate_ntype(tree, exec_stmt) 1977 && ((nch == 2) || (nch == 4) || (nch == 6)) 1978 && validate_name(CHILD(tree, 0), "exec") 1979 && validate_expr(CHILD(tree, 1))); 1980 1981 if (!res && !PyErr_Occurred()) 1982 err_string("illegal exec statement"); 1983 if (res && (nch > 2)) 1984 res = (validate_name(CHILD(tree, 2), "in") 1985 && validate_test(CHILD(tree, 3))); 1986 if (res && (nch == 6)) 1987 res = (validate_comma(CHILD(tree, 4)) 1988 && validate_test(CHILD(tree, 5))); 1989 1990 return (res); 1991 } 1992 1993 1994 /* assert_stmt: 1995 * 1996 * 'assert' test [',' test] 1997 */ 1998 static int 1999 validate_assert_stmt(node *tree) 2000 { 2001 int nch = NCH(tree); 2002 int res = (validate_ntype(tree, assert_stmt) 2003 && ((nch == 2) || (nch == 4)) 2004 && (validate_name(CHILD(tree, 0), "assert")) 2005 && validate_test(CHILD(tree, 1))); 2006 2007 if (!res && !PyErr_Occurred()) 2008 err_string("illegal assert statement"); 2009 if (res && (nch > 2)) 2010 res = (validate_comma(CHILD(tree, 2)) 2011 && validate_test(CHILD(tree, 3))); 2012 2013 return (res); 2014 } 2015 2016 2017 static int 2018 validate_while(node *tree) 2019 { 2020 int nch = NCH(tree); 2021 int res = (validate_ntype(tree, while_stmt) 2022 && ((nch == 4) || (nch == 7)) 2023 && validate_name(CHILD(tree, 0), "while") 2024 && validate_test(CHILD(tree, 1)) 2025 && validate_colon(CHILD(tree, 2)) 2026 && validate_suite(CHILD(tree, 3))); 2027 2028 if (res && (nch == 7)) 2029 res = (validate_name(CHILD(tree, 4), "else") 2030 && validate_colon(CHILD(tree, 5)) 2031 && validate_suite(CHILD(tree, 6))); 2032 2033 return (res); 2034 } 2035 2036 2037 static int 2038 validate_for(node *tree) 2039 { 2040 int nch = NCH(tree); 2041 int res = (validate_ntype(tree, for_stmt) 2042 && ((nch == 6) || (nch == 9)) 2043 && validate_name(CHILD(tree, 0), "for") 2044 && validate_exprlist(CHILD(tree, 1)) 2045 && validate_name(CHILD(tree, 2), "in") 2046 && validate_testlist(CHILD(tree, 3)) 2047 && validate_colon(CHILD(tree, 4)) 2048 && validate_suite(CHILD(tree, 5))); 2049 2050 if (res && (nch == 9)) 2051 res = (validate_name(CHILD(tree, 6), "else") 2052 && validate_colon(CHILD(tree, 7)) 2053 && validate_suite(CHILD(tree, 8))); 2054 2055 return (res); 2056 } 2057 2058 2059 /* try_stmt: 2060 * 'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite] 2061 ['finally' ':' suite] 2062 * | 'try' ':' suite 'finally' ':' suite 2063 * 2064 */ 2065 static int 2066 validate_try(node *tree) 2067 { 2068 int nch = NCH(tree); 2069 int pos = 3; 2070 int res = (validate_ntype(tree, try_stmt) 2071 && (nch >= 6) && ((nch % 3) == 0)); 2072 2073 if (res) 2074 res = (validate_name(CHILD(tree, 0), "try") 2075 && validate_colon(CHILD(tree, 1)) 2076 && validate_suite(CHILD(tree, 2)) 2077 && validate_colon(CHILD(tree, nch - 2)) 2078 && validate_suite(CHILD(tree, nch - 1))); 2079 else if (!PyErr_Occurred()) { 2080 const char* name = "except"; 2081 if (TYPE(CHILD(tree, nch - 3)) != except_clause) 2082 name = STR(CHILD(tree, nch - 3)); 2083 2084 PyErr_Format(parser_error, 2085 "Illegal number of children for try/%s node.", name); 2086 } 2087 /* Handle try/finally statement */ 2088 if (res && (TYPE(CHILD(tree, pos)) == NAME) && 2089 (strcmp(STR(CHILD(tree, pos)), "finally") == 0)) { 2090 res = (validate_numnodes(tree, 6, "try/finally") 2091 && validate_colon(CHILD(tree, 4)) 2092 && validate_suite(CHILD(tree, 5))); 2093 return (res); 2094 } 2095 /* try/except statement: skip past except_clause sections */ 2096 while (res && pos < nch && (TYPE(CHILD(tree, pos)) == except_clause)) { 2097 res = (validate_except_clause(CHILD(tree, pos)) 2098 && validate_colon(CHILD(tree, pos + 1)) 2099 && validate_suite(CHILD(tree, pos + 2))); 2100 pos += 3; 2101 } 2102 /* skip else clause */ 2103 if (res && pos < nch && (TYPE(CHILD(tree, pos)) == NAME) && 2104 (strcmp(STR(CHILD(tree, pos)), "else") == 0)) { 2105 res = (validate_colon(CHILD(tree, pos + 1)) 2106 && validate_suite(CHILD(tree, pos + 2))); 2107 pos += 3; 2108 } 2109 if (res && pos < nch) { 2110 /* last clause must be a finally */ 2111 res = (validate_name(CHILD(tree, pos), "finally") 2112 && validate_numnodes(tree, pos + 3, "try/except/finally") 2113 && validate_colon(CHILD(tree, pos + 1)) 2114 && validate_suite(CHILD(tree, pos + 2))); 2115 } 2116 return (res); 2117 } 2118 2119 2120 static int 2121 validate_except_clause(node *tree) 2122 { 2123 int nch = NCH(tree); 2124 int res = (validate_ntype(tree, except_clause) 2125 && ((nch == 1) || (nch == 2) || (nch == 4)) 2126 && validate_name(CHILD(tree, 0), "except")); 2127 2128 if (res && (nch > 1)) 2129 res = validate_test(CHILD(tree, 1)); 2130 if (res && (nch == 4)) { 2131 if (TYPE(CHILD(tree, 2)) == NAME) 2132 res = validate_name(CHILD(tree, 2), "as"); 2133 else 2134 res = validate_comma(CHILD(tree, 2)); 2135 res = res && validate_test(CHILD(tree, 3)); 2136 } 2137 return (res); 2138 } 2139 2140 2141 static int 2142 validate_test(node *tree) 2143 { 2144 int nch = NCH(tree); 2145 int res = validate_ntype(tree, test) && is_odd(nch); 2146 2147 if (res && (TYPE(CHILD(tree, 0)) == lambdef)) 2148 res = ((nch == 1) 2149 && validate_lambdef(CHILD(tree, 0))); 2150 else if (res) { 2151 res = validate_or_test(CHILD(tree, 0)); 2152 res = (res && (nch == 1 || (nch == 5 && 2153 validate_name(CHILD(tree, 1), "if") && 2154 validate_or_test(CHILD(tree, 2)) && 2155 validate_name(CHILD(tree, 3), "else") && 2156 validate_test(CHILD(tree, 4))))); 2157 } 2158 return (res); 2159 } 2160 2161 static int 2162 validate_old_test(node *tree) 2163 { 2164 int nch = NCH(tree); 2165 int res = validate_ntype(tree, old_test) && (nch == 1); 2166 2167 if (res && (TYPE(CHILD(tree, 0)) == old_lambdef)) 2168 res = (validate_old_lambdef(CHILD(tree, 0))); 2169 else if (res) { 2170 res = (validate_or_test(CHILD(tree, 0))); 2171 } 2172 return (res); 2173 } 2174 2175 static int 2176 validate_or_test(node *tree) 2177 { 2178 int nch = NCH(tree); 2179 int res = validate_ntype(tree, or_test) && is_odd(nch); 2180 2181 if (res) { 2182 int pos; 2183 res = validate_and_test(CHILD(tree, 0)); 2184 for (pos = 1; res && (pos < nch); pos += 2) 2185 res = (validate_name(CHILD(tree, pos), "or") 2186 && validate_and_test(CHILD(tree, pos + 1))); 2187 } 2188 return (res); 2189 } 2190 2191 2192 static int 2193 validate_and_test(node *tree) 2194 { 2195 int pos; 2196 int nch = NCH(tree); 2197 int res = (validate_ntype(tree, and_test) 2198 && is_odd(nch) 2199 && validate_not_test(CHILD(tree, 0))); 2200 2201 for (pos = 1; res && (pos < nch); pos += 2) 2202 res = (validate_name(CHILD(tree, pos), "and") 2203 && validate_not_test(CHILD(tree, 0))); 2204 2205 return (res); 2206 } 2207 2208 2209 static int 2210 validate_not_test(node *tree) 2211 { 2212 int nch = NCH(tree); 2213 int res = validate_ntype(tree, not_test) && ((nch == 1) || (nch == 2)); 2214 2215 if (res) { 2216 if (nch == 2) 2217 res = (validate_name(CHILD(tree, 0), "not") 2218 && validate_not_test(CHILD(tree, 1))); 2219 else if (nch == 1) 2220 res = validate_comparison(CHILD(tree, 0)); 2221 } 2222 return (res); 2223 } 2224 2225 2226 static int 2227 validate_comparison(node *tree) 2228 { 2229 int pos; 2230 int nch = NCH(tree); 2231 int res = (validate_ntype(tree, comparison) 2232 && is_odd(nch) 2233 && validate_expr(CHILD(tree, 0))); 2234 2235 for (pos = 1; res && (pos < nch); pos += 2) 2236 res = (validate_comp_op(CHILD(tree, pos)) 2237 && validate_expr(CHILD(tree, pos + 1))); 2238 2239 return (res); 2240 } 2241 2242 2243 static int 2244 validate_comp_op(node *tree) 2245 { 2246 int res = 0; 2247 int nch = NCH(tree); 2248 2249 if (!validate_ntype(tree, comp_op)) 2250 return (0); 2251 if (nch == 1) { 2252 /* 2253 * Only child will be a terminal with a well-defined symbolic name 2254 * or a NAME with a string of either 'is' or 'in' 2255 */ 2256 tree = CHILD(tree, 0); 2257 switch (TYPE(tree)) { 2258 case LESS: 2259 case GREATER: 2260 case EQEQUAL: 2261 case EQUAL: 2262 case LESSEQUAL: 2263 case GREATEREQUAL: 2264 case NOTEQUAL: 2265 res = 1; 2266 break; 2267 case NAME: 2268 res = ((strcmp(STR(tree), "in") == 0) 2269 || (strcmp(STR(tree), "is") == 0)); 2270 if (!res) { 2271 PyErr_Format(parser_error, 2272 "illegal operator '%s'", STR(tree)); 2273 } 2274 break; 2275 default: 2276 err_string("illegal comparison operator type"); 2277 break; 2278 } 2279 } 2280 else if ((res = validate_numnodes(tree, 2, "comp_op")) != 0) { 2281 res = (validate_ntype(CHILD(tree, 0), NAME) 2282 && validate_ntype(CHILD(tree, 1), NAME) 2283 && (((strcmp(STR(CHILD(tree, 0)), "is") == 0) 2284 && (strcmp(STR(CHILD(tree, 1)), "not") == 0)) 2285 || ((strcmp(STR(CHILD(tree, 0)), "not") == 0) 2286 && (strcmp(STR(CHILD(tree, 1)), "in") == 0)))); 2287 if (!res && !PyErr_Occurred()) 2288 err_string("unknown comparison operator"); 2289 } 2290 return (res); 2291 } 2292 2293 2294 static int 2295 validate_expr(node *tree) 2296 { 2297 int j; 2298 int nch = NCH(tree); 2299 int res = (validate_ntype(tree, expr) 2300 && is_odd(nch) 2301 && validate_xor_expr(CHILD(tree, 0))); 2302 2303 for (j = 2; res && (j < nch); j += 2) 2304 res = (validate_xor_expr(CHILD(tree, j)) 2305 && validate_vbar(CHILD(tree, j - 1))); 2306 2307 return (res); 2308 } 2309 2310 2311 static int 2312 validate_xor_expr(node *tree) 2313 { 2314 int j; 2315 int nch = NCH(tree); 2316 int res = (validate_ntype(tree, xor_expr) 2317 && is_odd(nch) 2318 && validate_and_expr(CHILD(tree, 0))); 2319 2320 for (j = 2; res && (j < nch); j += 2) 2321 res = (validate_circumflex(CHILD(tree, j - 1)) 2322 && validate_and_expr(CHILD(tree, j))); 2323 2324 return (res); 2325 } 2326 2327 2328 static int 2329 validate_and_expr(node *tree) 2330 { 2331 int pos; 2332 int nch = NCH(tree); 2333 int res = (validate_ntype(tree, and_expr) 2334 && is_odd(nch) 2335 && validate_shift_expr(CHILD(tree, 0))); 2336 2337 for (pos = 1; res && (pos < nch); pos += 2) 2338 res = (validate_ampersand(CHILD(tree, pos)) 2339 && validate_shift_expr(CHILD(tree, pos + 1))); 2340 2341 return (res); 2342 } 2343 2344 2345 static int 2346 validate_chain_two_ops(node *tree, int (*termvalid)(node *), int op1, int op2) 2347 { 2348 int pos = 1; 2349 int nch = NCH(tree); 2350 int res = (is_odd(nch) 2351 && (*termvalid)(CHILD(tree, 0))); 2352 2353 for ( ; res && (pos < nch); pos += 2) { 2354 if (TYPE(CHILD(tree, pos)) != op1) 2355 res = validate_ntype(CHILD(tree, pos), op2); 2356 if (res) 2357 res = (*termvalid)(CHILD(tree, pos + 1)); 2358 } 2359 return (res); 2360 } 2361 2362 2363 static int 2364 validate_shift_expr(node *tree) 2365 { 2366 return (validate_ntype(tree, shift_expr) 2367 && validate_chain_two_ops(tree, validate_arith_expr, 2368 LEFTSHIFT, RIGHTSHIFT)); 2369 } 2370 2371 2372 static int 2373 validate_arith_expr(node *tree) 2374 { 2375 return (validate_ntype(tree, arith_expr) 2376 && validate_chain_two_ops(tree, validate_term, PLUS, MINUS)); 2377 } 2378 2379 2380 static int 2381 validate_term(node *tree) 2382 { 2383 int pos = 1; 2384 int nch = NCH(tree); 2385 int res = (validate_ntype(tree, term) 2386 && is_odd(nch) 2387 && validate_factor(CHILD(tree, 0))); 2388 2389 for ( ; res && (pos < nch); pos += 2) 2390 res = (((TYPE(CHILD(tree, pos)) == STAR) 2391 || (TYPE(CHILD(tree, pos)) == SLASH) 2392 || (TYPE(CHILD(tree, pos)) == DOUBLESLASH) 2393 || (TYPE(CHILD(tree, pos)) == PERCENT)) 2394 && validate_factor(CHILD(tree, pos + 1))); 2395 2396 return (res); 2397 } 2398 2399 2400 /* factor: 2401 * 2402 * factor: ('+'|'-'|'~') factor | power 2403 */ 2404 static int 2405 validate_factor(node *tree) 2406 { 2407 int nch = NCH(tree); 2408 int res = (validate_ntype(tree, factor) 2409 && (((nch == 2) 2410 && ((TYPE(CHILD(tree, 0)) == PLUS) 2411 || (TYPE(CHILD(tree, 0)) == MINUS) 2412 || (TYPE(CHILD(tree, 0)) == TILDE)) 2413 && validate_factor(CHILD(tree, 1))) 2414 || ((nch == 1) 2415 && validate_power(CHILD(tree, 0))))); 2416 return (res); 2417 } 2418 2419 2420 /* power: 2421 * 2422 * power: atom trailer* ('**' factor)* 2423 */ 2424 static int 2425 validate_power(node *tree) 2426 { 2427 int pos = 1; 2428 int nch = NCH(tree); 2429 int res = (validate_ntype(tree, power) && (nch >= 1) 2430 && validate_atom(CHILD(tree, 0))); 2431 2432 while (res && (pos < nch) && (TYPE(CHILD(tree, pos)) == trailer)) 2433 res = validate_trailer(CHILD(tree, pos++)); 2434 if (res && (pos < nch)) { 2435 if (!is_even(nch - pos)) { 2436 err_string("illegal number of nodes for 'power'"); 2437 return (0); 2438 } 2439 for ( ; res && (pos < (nch - 1)); pos += 2) 2440 res = (validate_doublestar(CHILD(tree, pos)) 2441 && validate_factor(CHILD(tree, pos + 1))); 2442 } 2443 return (res); 2444 } 2445 2446 2447 static int 2448 validate_atom(node *tree) 2449 { 2450 int pos; 2451 int nch = NCH(tree); 2452 int res = validate_ntype(tree, atom); 2453 2454 if (res && nch < 1) 2455 res = validate_numnodes(tree, nch+1, "atom"); 2456 if (res) { 2457 switch (TYPE(CHILD(tree, 0))) { 2458 case LPAR: 2459 res = ((nch <= 3) 2460 && (validate_rparen(CHILD(tree, nch - 1)))); 2461 2462 if (res && (nch == 3)) { 2463 if (TYPE(CHILD(tree, 1))==yield_expr) 2464 res = validate_yield_expr(CHILD(tree, 1)); 2465 else 2466 res = validate_testlist_comp(CHILD(tree, 1)); 2467 } 2468 break; 2469 case LSQB: 2470 if (nch == 2) 2471 res = validate_ntype(CHILD(tree, 1), RSQB); 2472 else if (nch == 3) 2473 res = (validate_listmaker(CHILD(tree, 1)) 2474 && validate_ntype(CHILD(tree, 2), RSQB)); 2475 else { 2476 res = 0; 2477 err_string("illegal list display atom"); 2478 } 2479 break; 2480 case LBRACE: 2481 res = ((nch <= 3) 2482 && validate_ntype(CHILD(tree, nch - 1), RBRACE)); 2483 2484 if (res && (nch == 3)) 2485 res = validate_dictorsetmaker(CHILD(tree, 1)); 2486 break; 2487 case BACKQUOTE: 2488 res = ((nch == 3) 2489 && validate_testlist1(CHILD(tree, 1)) 2490 && validate_ntype(CHILD(tree, 2), BACKQUOTE)); 2491 break; 2492 case NAME: 2493 case NUMBER: 2494 res = (nch == 1); 2495 break; 2496 case STRING: 2497 for (pos = 1; res && (pos < nch); ++pos) 2498 res = validate_ntype(CHILD(tree, pos), STRING); 2499 break; 2500 default: 2501 res = 0; 2502 break; 2503 } 2504 } 2505 return (res); 2506 } 2507 2508 2509 /* listmaker: 2510 * test ( list_for | (',' test)* [','] ) 2511 */ 2512 static int 2513 validate_listmaker(node *tree) 2514 { 2515 int nch = NCH(tree); 2516 int ok = nch; 2517 2518 if (nch == 0) 2519 err_string("missing child nodes of listmaker"); 2520 else 2521 ok = validate_test(CHILD(tree, 0)); 2522 2523 /* 2524 * list_for | (',' test)* [','] 2525 */ 2526 if (nch == 2 && TYPE(CHILD(tree, 1)) == list_for) 2527 ok = validate_list_for(CHILD(tree, 1)); 2528 else { 2529 /* (',' test)* [','] */ 2530 int i = 1; 2531 while (ok && nch - i >= 2) { 2532 ok = (validate_comma(CHILD(tree, i)) 2533 && validate_test(CHILD(tree, i+1))); 2534 i += 2; 2535 } 2536 if (ok && i == nch-1) 2537 ok = validate_comma(CHILD(tree, i)); 2538 else if (i != nch) { 2539 ok = 0; 2540 err_string("illegal trailing nodes for listmaker"); 2541 } 2542 } 2543 return ok; 2544 } 2545 2546 /* testlist_comp: 2547 * test ( comp_for | (',' test)* [','] ) 2548 */ 2549 static int 2550 validate_testlist_comp(node *tree) 2551 { 2552 int nch = NCH(tree); 2553 int ok = nch; 2554 2555 if (nch == 0) 2556 err_string("missing child nodes of testlist_comp"); 2557 else { 2558 ok = validate_test(CHILD(tree, 0)); 2559 } 2560 2561 /* 2562 * comp_for | (',' test)* [','] 2563 */ 2564 if (nch == 2 && TYPE(CHILD(tree, 1)) == comp_for) 2565 ok = validate_comp_for(CHILD(tree, 1)); 2566 else { 2567 /* (',' test)* [','] */ 2568 int i = 1; 2569 while (ok && nch - i >= 2) { 2570 ok = (validate_comma(CHILD(tree, i)) 2571 && validate_test(CHILD(tree, i+1))); 2572 i += 2; 2573 } 2574 if (ok && i == nch-1) 2575 ok = validate_comma(CHILD(tree, i)); 2576 else if (i != nch) { 2577 ok = 0; 2578 err_string("illegal trailing nodes for testlist_comp"); 2579 } 2580 } 2581 return ok; 2582 } 2583 2584 /* decorator: 2585 * '@' dotted_name [ '(' [arglist] ')' ] NEWLINE 2586 */ 2587 static int 2588 validate_decorator(node *tree) 2589 { 2590 int ok; 2591 int nch = NCH(tree); 2592 ok = (validate_ntype(tree, decorator) && 2593 (nch == 3 || nch == 5 || nch == 6) && 2594 validate_at(CHILD(tree, 0)) && 2595 validate_dotted_name(CHILD(tree, 1)) && 2596 validate_newline(RCHILD(tree, -1))); 2597 2598 if (ok && nch != 3) { 2599 ok = (validate_lparen(CHILD(tree, 2)) && 2600 validate_rparen(RCHILD(tree, -2))); 2601 2602 if (ok && nch == 6) 2603 ok = validate_arglist(CHILD(tree, 3)); 2604 } 2605 2606 return ok; 2607 } 2608 2609 /* decorators: 2610 * decorator+ 2611 */ 2612 static int 2613 validate_decorators(node *tree) 2614 { 2615 int i, nch, ok; 2616 nch = NCH(tree); 2617 ok = validate_ntype(tree, decorators) && nch >= 1; 2618 2619 for (i = 0; ok && i < nch; ++i) 2620 ok = validate_decorator(CHILD(tree, i)); 2621 2622 return ok; 2623 } 2624 2625 /* with_item: 2626 * test ['as' expr] 2627 */ 2628 static int 2629 validate_with_item(node *tree) 2630 { 2631 int nch = NCH(tree); 2632 int ok = (validate_ntype(tree, with_item) 2633 && (nch == 1 || nch == 3) 2634 && validate_test(CHILD(tree, 0))); 2635 if (ok && nch == 3) 2636 ok = (validate_name(CHILD(tree, 1), "as") 2637 && validate_expr(CHILD(tree, 2))); 2638 return ok; 2639 } 2640 2641 /* with_stmt: 2642 * 0 1 ... -2 -1 2643 * 'with' with_item (',' with_item)* ':' suite 2644 */ 2645 static int 2646 validate_with_stmt(node *tree) 2647 { 2648 int i; 2649 int nch = NCH(tree); 2650 int ok = (validate_ntype(tree, with_stmt) 2651 && (nch % 2 == 0) 2652 && validate_name(CHILD(tree, 0), "with") 2653 && validate_colon(RCHILD(tree, -2)) 2654 && validate_suite(RCHILD(tree, -1))); 2655 for (i = 1; ok && i < nch - 2; i += 2) 2656 ok = validate_with_item(CHILD(tree, i)); 2657 return ok; 2658 } 2659 2660 /* funcdef: 2661 * 2662 * -5 -4 -3 -2 -1 2663 * 'def' NAME parameters ':' suite 2664 */ 2665 static int 2666 validate_funcdef(node *tree) 2667 { 2668 int nch = NCH(tree); 2669 int ok = (validate_ntype(tree, funcdef) 2670 && (nch == 5) 2671 && validate_name(RCHILD(tree, -5), "def") 2672 && validate_ntype(RCHILD(tree, -4), NAME) 2673 && validate_colon(RCHILD(tree, -2)) 2674 && validate_parameters(RCHILD(tree, -3)) 2675 && validate_suite(RCHILD(tree, -1))); 2676 return ok; 2677 } 2678 2679 2680 /* decorated 2681 * decorators (classdef | funcdef) 2682 */ 2683 static int 2684 validate_decorated(node *tree) 2685 { 2686 int nch = NCH(tree); 2687 int ok = (validate_ntype(tree, decorated) 2688 && (nch == 2) 2689 && validate_decorators(RCHILD(tree, -2))); 2690 if (TYPE(RCHILD(tree, -1)) == funcdef) 2691 ok = ok && validate_funcdef(RCHILD(tree, -1)); 2692 else 2693 ok = ok && validate_class(RCHILD(tree, -1)); 2694 return ok; 2695 } 2696 2697 static int 2698 validate_lambdef(node *tree) 2699 { 2700 int nch = NCH(tree); 2701 int res = (validate_ntype(tree, lambdef) 2702 && ((nch == 3) || (nch == 4)) 2703 && validate_name(CHILD(tree, 0), "lambda") 2704 && validate_colon(CHILD(tree, nch - 2)) 2705 && validate_test(CHILD(tree, nch - 1))); 2706 2707 if (res && (nch == 4)) 2708 res = validate_varargslist(CHILD(tree, 1)); 2709 else if (!res && !PyErr_Occurred()) 2710 (void) validate_numnodes(tree, 3, "lambdef"); 2711 2712 return (res); 2713 } 2714 2715 2716 static int 2717 validate_old_lambdef(node *tree) 2718 { 2719 int nch = NCH(tree); 2720 int res = (validate_ntype(tree, old_lambdef) 2721 && ((nch == 3) || (nch == 4)) 2722 && validate_name(CHILD(tree, 0), "lambda") 2723 && validate_colon(CHILD(tree, nch - 2)) 2724 && validate_test(CHILD(tree, nch - 1))); 2725 2726 if (res && (nch == 4)) 2727 res = validate_varargslist(CHILD(tree, 1)); 2728 else if (!res && !PyErr_Occurred()) 2729 (void) validate_numnodes(tree, 3, "old_lambdef"); 2730 2731 return (res); 2732 } 2733 2734 2735 /* arglist: 2736 * 2737 * (argument ',')* (argument [','] | '*' test [',' '**' test] | '**' test) 2738 */ 2739 static int 2740 validate_arglist(node *tree) 2741 { 2742 int nch = NCH(tree); 2743 int i = 0; 2744 int ok = 1; 2745 2746 if (nch <= 0) 2747 /* raise the right error from having an invalid number of children */ 2748 return validate_numnodes(tree, nch + 1, "arglist"); 2749 2750 if (nch > 1) { 2751 for (i=0; i<nch; i++) { 2752 if (TYPE(CHILD(tree, i)) == argument) { 2753 node *ch = CHILD(tree, i); 2754 if (NCH(ch) == 2 && TYPE(CHILD(ch, 1)) == comp_for) { 2755 err_string("need '(', ')' for generator expression"); 2756 return 0; 2757 } 2758 } 2759 } 2760 } 2761 2762 while (ok && nch-i >= 2) { 2763 /* skip leading (argument ',') */ 2764 ok = (validate_argument(CHILD(tree, i)) 2765 && validate_comma(CHILD(tree, i+1))); 2766 if (ok) 2767 i += 2; 2768 else 2769 PyErr_Clear(); 2770 } 2771 ok = 1; 2772 if (nch-i > 0) { 2773 /* 2774 * argument | '*' test [',' '**' test] | '**' test 2775 */ 2776 int sym = TYPE(CHILD(tree, i)); 2777 2778 if (sym == argument) { 2779 ok = validate_argument(CHILD(tree, i)); 2780 if (ok && i+1 != nch) { 2781 err_string("illegal arglist specification" 2782 " (extra stuff on end)"); 2783 ok = 0; 2784 } 2785 } 2786 else if (sym == STAR) { 2787 ok = validate_star(CHILD(tree, i)); 2788 if (ok && (nch-i == 2)) 2789 ok = validate_test(CHILD(tree, i+1)); 2790 else if (ok && (nch-i == 5)) 2791 ok = (validate_test(CHILD(tree, i+1)) 2792 && validate_comma(CHILD(tree, i+2)) 2793 && validate_doublestar(CHILD(tree, i+3)) 2794 && validate_test(CHILD(tree, i+4))); 2795 else { 2796 err_string("illegal use of '*' in arglist"); 2797 ok = 0; 2798 } 2799 } 2800 else if (sym == DOUBLESTAR) { 2801 if (nch-i == 2) 2802 ok = (validate_doublestar(CHILD(tree, i)) 2803 && validate_test(CHILD(tree, i+1))); 2804 else { 2805 err_string("illegal use of '**' in arglist"); 2806 ok = 0; 2807 } 2808 } 2809 else { 2810 err_string("illegal arglist specification"); 2811 ok = 0; 2812 } 2813 } 2814 return (ok); 2815 } 2816 2817 2818 2819 /* argument: 2820 * 2821 * [test '='] test [comp_for] 2822 */ 2823 static int 2824 validate_argument(node *tree) 2825 { 2826 int nch = NCH(tree); 2827 int res = (validate_ntype(tree, argument) 2828 && ((nch == 1) || (nch == 2) || (nch == 3)) 2829 && validate_test(CHILD(tree, 0))); 2830 2831 if (res && (nch == 2)) 2832 res = validate_comp_for(CHILD(tree, 1)); 2833 else if (res && (nch == 3)) 2834 res = (validate_equal(CHILD(tree, 1)) 2835 && validate_test(CHILD(tree, 2))); 2836 2837 return (res); 2838 } 2839 2840 2841 2842 /* trailer: 2843 * 2844 * '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME 2845 */ 2846 static int 2847 validate_trailer(node *tree) 2848 { 2849 int nch = NCH(tree); 2850 int res = validate_ntype(tree, trailer) && ((nch == 2) || (nch == 3)); 2851 2852 if (res) { 2853 switch (TYPE(CHILD(tree, 0))) { 2854 case LPAR: 2855 res = validate_rparen(CHILD(tree, nch - 1)); 2856 if (res && (nch == 3)) 2857 res = validate_arglist(CHILD(tree, 1)); 2858 break; 2859 case LSQB: 2860 res = (validate_numnodes(tree, 3, "trailer") 2861 && validate_subscriptlist(CHILD(tree, 1)) 2862 && validate_ntype(CHILD(tree, 2), RSQB)); 2863 break; 2864 case DOT: 2865 res = (validate_numnodes(tree, 2, "trailer") 2866 && validate_ntype(CHILD(tree, 1), NAME)); 2867 break; 2868 default: 2869 res = 0; 2870 break; 2871 } 2872 } 2873 else { 2874 (void) validate_numnodes(tree, 2, "trailer"); 2875 } 2876 return (res); 2877 } 2878 2879 2880 /* subscriptlist: 2881 * 2882 * subscript (',' subscript)* [','] 2883 */ 2884 static int 2885 validate_subscriptlist(node *tree) 2886 { 2887 return (validate_repeating_list(tree, subscriptlist, 2888 validate_subscript, "subscriptlist")); 2889 } 2890 2891 2892 /* subscript: 2893 * 2894 * '.' '.' '.' | test | [test] ':' [test] [sliceop] 2895 */ 2896 static int 2897 validate_subscript(node *tree) 2898 { 2899 int offset = 0; 2900 int nch = NCH(tree); 2901 int res = validate_ntype(tree, subscript) && (nch >= 1) && (nch <= 4); 2902 2903 if (!res) { 2904 if (!PyErr_Occurred()) 2905 err_string("invalid number of arguments for subscript node"); 2906 return (0); 2907 } 2908 if (TYPE(CHILD(tree, 0)) == DOT) 2909 /* take care of ('.' '.' '.') possibility */ 2910 return (validate_numnodes(tree, 3, "subscript") 2911 && validate_dot(CHILD(tree, 0)) 2912 && validate_dot(CHILD(tree, 1)) 2913 && validate_dot(CHILD(tree, 2))); 2914 if (nch == 1) { 2915 if (TYPE(CHILD(tree, 0)) == test) 2916 res = validate_test(CHILD(tree, 0)); 2917 else 2918 res = validate_colon(CHILD(tree, 0)); 2919 return (res); 2920 } 2921 /* Must be [test] ':' [test] [sliceop], 2922 * but at least one of the optional components will 2923 * be present, but we don't know which yet. 2924 */ 2925 if ((TYPE(CHILD(tree, 0)) != COLON) || (nch == 4)) { 2926 res = validate_test(CHILD(tree, 0)); 2927 offset = 1; 2928 } 2929 if (res) 2930 res = validate_colon(CHILD(tree, offset)); 2931 if (res) { 2932 int rem = nch - ++offset; 2933 if (rem) { 2934 if (TYPE(CHILD(tree, offset)) == test) { 2935 res = validate_test(CHILD(tree, offset)); 2936 ++offset; 2937 --rem; 2938 } 2939 if (res && rem) 2940 res = validate_sliceop(CHILD(tree, offset)); 2941 } 2942 } 2943 return (res); 2944 } 2945 2946 2947 static int 2948 validate_sliceop(node *tree) 2949 { 2950 int nch = NCH(tree); 2951 int res = ((nch == 1) || validate_numnodes(tree, 2, "sliceop")) 2952 && validate_ntype(tree, sliceop); 2953 if (!res && !PyErr_Occurred()) { 2954 res = validate_numnodes(tree, 1, "sliceop"); 2955 } 2956 if (res) 2957 res = validate_colon(CHILD(tree, 0)); 2958 if (res && (nch == 2)) 2959 res = validate_test(CHILD(tree, 1)); 2960 2961 return (res); 2962 } 2963 2964 2965 static int 2966 validate_exprlist(node *tree) 2967 { 2968 return (validate_repeating_list(tree, exprlist, 2969 validate_expr, "exprlist")); 2970 } 2971 2972 2973 /* 2974 * dictorsetmaker: 2975 * 2976 * (test ':' test (comp_for | (',' test ':' test)* [','])) | 2977 * (test (comp_for | (',' test)* [','])) 2978 */ 2979 static int 2980 validate_dictorsetmaker(node *tree) 2981 { 2982 int nch = NCH(tree); 2983 int ok = validate_ntype(tree, dictorsetmaker); 2984 int i = 0; 2985 int check_trailing_comma = 0; 2986 2987 assert(nch > 0); 2988 2989 if (ok && (nch == 1 || TYPE(CHILD(tree, 1)) == COMMA)) { 2990 /* We got a set: 2991 * test (',' test)* [','] 2992 */ 2993 ok = validate_test(CHILD(tree, i++)); 2994 while (ok && nch - i >= 2) { 2995 ok = (validate_comma(CHILD(tree, i)) 2996 && validate_test(CHILD(tree, i+1))); 2997 i += 2; 2998 } 2999 check_trailing_comma = 1; 3000 } 3001 else if (ok && TYPE(CHILD(tree, 1)) == comp_for) { 3002 /* We got a set comprehension: 3003 * test comp_for 3004 */ 3005 ok = (validate_test(CHILD(tree, 0)) 3006 && validate_comp_for(CHILD(tree, 1))); 3007 } 3008 else if (ok && NCH(tree) > 3 && TYPE(CHILD(tree, 3)) == comp_for) { 3009 /* We got a dict comprehension: 3010 * test ':' test comp_for 3011 */ 3012 ok = (validate_test(CHILD(tree, 0)) 3013 && validate_colon(CHILD(tree, 1)) 3014 && validate_test(CHILD(tree, 2)) 3015 && validate_comp_for(CHILD(tree, 3))); 3016 } 3017 else if (ok) { 3018 /* We got a dict: 3019 * test ':' test (',' test ':' test)* [','] 3020 */ 3021 if (nch >= 3) { 3022 ok = (validate_test(CHILD(tree, i)) 3023 && validate_colon(CHILD(tree, i+1)) 3024 && validate_test(CHILD(tree, i+2))); 3025 i += 3; 3026 } 3027 else { 3028 ok = 0; 3029 err_string("illegal number of nodes for dictorsetmaker"); 3030 } 3031 3032 while (ok && nch - i >= 4) { 3033 ok = (validate_comma(CHILD(tree, i)) 3034 && validate_test(CHILD(tree, i+1)) 3035 && validate_colon(CHILD(tree, i+2)) 3036 && validate_test(CHILD(tree, i+3))); 3037 i += 4; 3038 } 3039 check_trailing_comma = 1; 3040 } 3041 if (ok && check_trailing_comma) { 3042 if (i == nch-1) 3043 ok = validate_comma(CHILD(tree, i)); 3044 else if (i != nch) { 3045 ok = 0; 3046 err_string("illegal trailing nodes for dictorsetmaker"); 3047 } 3048 } 3049 3050 return ok; 3051 } 3052 3053 3054 static int 3055 validate_eval_input(node *tree) 3056 { 3057 int pos; 3058 int nch = NCH(tree); 3059 int res = (validate_ntype(tree, eval_input) 3060 && (nch >= 2) 3061 && validate_testlist(CHILD(tree, 0)) 3062 && validate_ntype(CHILD(tree, nch - 1), ENDMARKER)); 3063 3064 for (pos = 1; res && (pos < (nch - 1)); ++pos) 3065 res = validate_ntype(CHILD(tree, pos), NEWLINE); 3066 3067 return (res); 3068 } 3069 3070 3071 static int 3072 validate_node(node *tree) 3073 { 3074 int nch = 0; /* num. children on current node */ 3075 int res = 1; /* result value */ 3076 node* next = 0; /* node to process after this one */ 3077 3078 while (res && (tree != 0)) { 3079 nch = NCH(tree); 3080 next = 0; 3081 switch (TYPE(tree)) { 3082 /* 3083 * Definition nodes. 3084 */ 3085 case funcdef: 3086 res = validate_funcdef(tree); 3087 break; 3088 case with_stmt: 3089 res = validate_with_stmt(tree); 3090 break; 3091 case classdef: 3092 res = validate_class(tree); 3093 break; 3094 case decorated: 3095 res = validate_decorated(tree); 3096 break; 3097 /* 3098 * "Trivial" parse tree nodes. 3099 * (Why did I call these trivial?) 3100 */ 3101 case stmt: 3102 res = validate_stmt(tree); 3103 break; 3104 case small_stmt: 3105 /* 3106 * expr_stmt | print_stmt | del_stmt | pass_stmt | flow_stmt 3107 * | import_stmt | global_stmt | exec_stmt | assert_stmt 3108 */ 3109 res = validate_small_stmt(tree); 3110 break; 3111 case flow_stmt: 3112 res = (validate_numnodes(tree, 1, "flow_stmt") 3113 && ((TYPE(CHILD(tree, 0)) == break_stmt) 3114 || (TYPE(CHILD(tree, 0)) == continue_stmt) 3115 || (TYPE(CHILD(tree, 0)) == yield_stmt) 3116 || (TYPE(CHILD(tree, 0)) == return_stmt) 3117 || (TYPE(CHILD(tree, 0)) == raise_stmt))); 3118 if (res) 3119 next = CHILD(tree, 0); 3120 else if (nch == 1) 3121 err_string("illegal flow_stmt type"); 3122 break; 3123 case yield_stmt: 3124 res = validate_yield_stmt(tree); 3125 break; 3126 /* 3127 * Compound statements. 3128 */ 3129 case simple_stmt: 3130 res = validate_simple_stmt(tree); 3131 break; 3132 case compound_stmt: 3133 res = validate_compound_stmt(tree); 3134 break; 3135 /* 3136 * Fundamental statements. 3137 */ 3138 case expr_stmt: 3139 res = validate_expr_stmt(tree); 3140 break; 3141 case print_stmt: 3142 res = validate_print_stmt(tree); 3143 break; 3144 case del_stmt: 3145 res = validate_del_stmt(tree); 3146 break; 3147 case pass_stmt: 3148 res = (validate_numnodes(tree, 1, "pass") 3149 && validate_name(CHILD(tree, 0), "pass")); 3150 break; 3151 case break_stmt: 3152 res = (validate_numnodes(tree, 1, "break") 3153 && validate_name(CHILD(tree, 0), "break")); 3154 break; 3155 case continue_stmt: 3156 res = (validate_numnodes(tree, 1, "continue") 3157 && validate_name(CHILD(tree, 0), "continue")); 3158 break; 3159 case return_stmt: 3160 res = validate_return_stmt(tree); 3161 break; 3162 case raise_stmt: 3163 res = validate_raise_stmt(tree); 3164 break; 3165 case import_stmt: 3166 res = validate_import_stmt(tree); 3167 break; 3168 case import_name: 3169 res = validate_import_name(tree); 3170 break; 3171 case import_from: 3172 res = validate_import_from(tree); 3173 break; 3174 case global_stmt: 3175 res = validate_global_stmt(tree); 3176 break; 3177 case exec_stmt: 3178 res = validate_exec_stmt(tree); 3179 break; 3180 case assert_stmt: 3181 res = validate_assert_stmt(tree); 3182 break; 3183 case if_stmt: 3184 res = validate_if(tree); 3185 break; 3186 case while_stmt: 3187 res = validate_while(tree); 3188 break; 3189 case for_stmt: 3190 res = validate_for(tree); 3191 break; 3192 case try_stmt: 3193 res = validate_try(tree); 3194 break; 3195 case suite: 3196 res = validate_suite(tree); 3197 break; 3198 /* 3199 * Expression nodes. 3200 */ 3201 case testlist: 3202 res = validate_testlist(tree); 3203 break; 3204 case yield_expr: 3205 res = validate_yield_expr(tree); 3206 break; 3207 case testlist1: 3208 res = validate_testlist1(tree); 3209 break; 3210 case test: 3211 res = validate_test(tree); 3212 break; 3213 case and_test: 3214 res = validate_and_test(tree); 3215 break; 3216 case not_test: 3217 res = validate_not_test(tree); 3218 break; 3219 case comparison: 3220 res = validate_comparison(tree); 3221 break; 3222 case exprlist: 3223 res = validate_exprlist(tree); 3224 break; 3225 case comp_op: 3226 res = validate_comp_op(tree); 3227 break; 3228 case expr: 3229 res = validate_expr(tree); 3230 break; 3231 case xor_expr: 3232 res = validate_xor_expr(tree); 3233 break; 3234 case and_expr: 3235 res = validate_and_expr(tree); 3236 break; 3237 case shift_expr: 3238 res = validate_shift_expr(tree); 3239 break; 3240 case arith_expr: 3241 res = validate_arith_expr(tree); 3242 break; 3243 case term: 3244 res = validate_term(tree); 3245 break; 3246 case factor: 3247 res = validate_factor(tree); 3248 break; 3249 case power: 3250 res = validate_power(tree); 3251 break; 3252 case atom: 3253 res = validate_atom(tree); 3254 break; 3255 3256 default: 3257 /* Hopefully never reached! */ 3258 err_string("unrecognized node type"); 3259 res = 0; 3260 break; 3261 } 3262 tree = next; 3263 } 3264 return (res); 3265 } 3266 3267 3268 static int 3269 validate_expr_tree(node *tree) 3270 { 3271 int res = validate_eval_input(tree); 3272 3273 if (!res && !PyErr_Occurred()) 3274 err_string("could not validate expression tuple"); 3275 3276 return (res); 3277 } 3278 3279 3280 /* file_input: 3281 * (NEWLINE | stmt)* ENDMARKER 3282 */ 3283 static int 3284 validate_file_input(node *tree) 3285 { 3286 int j; 3287 int nch = NCH(tree) - 1; 3288 int res = ((nch >= 0) 3289 && validate_ntype(CHILD(tree, nch), ENDMARKER)); 3290 3291 for (j = 0; res && (j < nch); ++j) { 3292 if (TYPE(CHILD(tree, j)) == stmt) 3293 res = validate_stmt(CHILD(tree, j)); 3294 else 3295 res = validate_newline(CHILD(tree, j)); 3296 } 3297 /* This stays in to prevent any internal failures from getting to the 3298 * user. Hopefully, this won't be needed. If a user reports getting 3299 * this, we have some debugging to do. 3300 */ 3301 if (!res && !PyErr_Occurred()) 3302 err_string("VALIDATION FAILURE: report this to the maintainer!"); 3303 3304 return (res); 3305 } 3306 3307 static int 3308 validate_encoding_decl(node *tree) 3309 { 3310 int nch = NCH(tree); 3311 int res = ((nch == 1) 3312 && validate_file_input(CHILD(tree, 0))); 3313 3314 if (!res && !PyErr_Occurred()) 3315 err_string("Error Parsing encoding_decl"); 3316 3317 return res; 3318 } 3319 3320 static PyObject* 3321 pickle_constructor = NULL; 3322 3323 3324 static PyObject* 3325 parser__pickler(PyObject *self, PyObject *args) 3326 { 3327 NOTE(ARGUNUSED(self)) 3328 PyObject *result = NULL; 3329 PyObject *st = NULL; 3330 PyObject *empty_dict = NULL; 3331 3332 if (PyArg_ParseTuple(args, "O!:_pickler", &PyST_Type, &st)) { 3333 PyObject *newargs; 3334 PyObject *tuple; 3335 3336 if ((empty_dict = PyDict_New()) == NULL) 3337 goto finally; 3338 if ((newargs = Py_BuildValue("Oi", st, 1)) == NULL) 3339 goto finally; 3340 tuple = parser_st2tuple((PyST_Object*)NULL, newargs, empty_dict); 3341 if (tuple != NULL) { 3342 result = Py_BuildValue("O(O)", pickle_constructor, tuple); 3343 Py_DECREF(tuple); 3344 } 3345 Py_DECREF(empty_dict); 3346 Py_DECREF(newargs); 3347 } 3348 finally: 3349 Py_XDECREF(empty_dict); 3350 3351 return (result); 3352 } 3353 3354 3355 /* Functions exported by this module. Most of this should probably 3356 * be converted into an ST object with methods, but that is better 3357 * done directly in Python, allowing subclasses to be created directly. 3358 * We'd really have to write a wrapper around it all anyway to allow 3359 * inheritance. 3360 */ 3361 static PyMethodDef parser_functions[] = { 3362 {"ast2tuple", (PyCFunction)parser_ast2tuple, PUBLIC_METHOD_TYPE, 3363 PyDoc_STR("Creates a tuple-tree representation of an ST.")}, 3364 {"ast2list", (PyCFunction)parser_ast2list, PUBLIC_METHOD_TYPE, 3365 PyDoc_STR("Creates a list-tree representation of an ST.")}, 3366 {"compileast", (PyCFunction)parser_compileast,PUBLIC_METHOD_TYPE, 3367 PyDoc_STR("Compiles an ST object into a code object.")}, 3368 {"compilest", (PyCFunction)parser_compilest, PUBLIC_METHOD_TYPE, 3369 PyDoc_STR("Compiles an ST object into a code object.")}, 3370 {"expr", (PyCFunction)parser_expr, PUBLIC_METHOD_TYPE, 3371 PyDoc_STR("Creates an ST object from an expression.")}, 3372 {"isexpr", (PyCFunction)parser_isexpr, PUBLIC_METHOD_TYPE, 3373 PyDoc_STR("Determines if an ST object was created from an expression.")}, 3374 {"issuite", (PyCFunction)parser_issuite, PUBLIC_METHOD_TYPE, 3375 PyDoc_STR("Determines if an ST object was created from a suite.")}, 3376 {"suite", (PyCFunction)parser_suite, PUBLIC_METHOD_TYPE, 3377 PyDoc_STR("Creates an ST object from a suite.")}, 3378 {"sequence2ast", (PyCFunction)parser_tuple2ast, PUBLIC_METHOD_TYPE, 3379 PyDoc_STR("Creates an ST object from a tree representation.")}, 3380 {"sequence2st", (PyCFunction)parser_tuple2st, PUBLIC_METHOD_TYPE, 3381 PyDoc_STR("Creates an ST object from a tree representation.")}, 3382 {"st2tuple", (PyCFunction)parser_st2tuple, PUBLIC_METHOD_TYPE, 3383 PyDoc_STR("Creates a tuple-tree representation of an ST.")}, 3384 {"st2list", (PyCFunction)parser_st2list, PUBLIC_METHOD_TYPE, 3385 PyDoc_STR("Creates a list-tree representation of an ST.")}, 3386 {"tuple2ast", (PyCFunction)parser_tuple2ast, PUBLIC_METHOD_TYPE, 3387 PyDoc_STR("Creates an ST object from a tree representation.")}, 3388 {"tuple2st", (PyCFunction)parser_tuple2st, PUBLIC_METHOD_TYPE, 3389 PyDoc_STR("Creates an ST object from a tree representation.")}, 3390 3391 /* private stuff: support pickle module */ 3392 {"_pickler", (PyCFunction)parser__pickler, METH_VARARGS, 3393 PyDoc_STR("Returns the pickle magic to allow ST objects to be pickled.")}, 3394 3395 {NULL, NULL, 0, NULL} 3396 }; 3397 3398 3399 PyMODINIT_FUNC initparser(void); /* supply a prototype */ 3400 3401 PyMODINIT_FUNC 3402 initparser(void) 3403 { 3404 PyObject *module, *copyreg; 3405 3406 Py_TYPE(&PyST_Type) = &PyType_Type; 3407 module = Py_InitModule("parser", parser_functions); 3408 if (module == NULL) 3409 return; 3410 3411 if (parser_error == 0) 3412 parser_error = PyErr_NewException("parser.ParserError", NULL, NULL); 3413 3414 if (parser_error == 0) 3415 /* caller will check PyErr_Occurred() */ 3416 return; 3417 /* CAUTION: The code next used to skip bumping the refcount on 3418 * parser_error. That's a disaster if initparser() gets called more 3419 * than once. By incref'ing, we ensure that each module dict that 3420 * gets created owns its reference to the shared parser_error object, 3421 * and the file static parser_error vrbl owns a reference too. 3422 */ 3423 Py_INCREF(parser_error); 3424 if (PyModule_AddObject(module, "ParserError", parser_error) != 0) 3425 return; 3426 3427 Py_INCREF(&PyST_Type); 3428 PyModule_AddObject(module, "ASTType", (PyObject*)&PyST_Type); 3429 Py_INCREF(&PyST_Type); 3430 PyModule_AddObject(module, "STType", (PyObject*)&PyST_Type); 3431 3432 PyModule_AddStringConstant(module, "__copyright__", 3433 parser_copyright_string); 3434 PyModule_AddStringConstant(module, "__doc__", 3435 parser_doc_string); 3436 PyModule_AddStringConstant(module, "__version__", 3437 parser_version_string); 3438 3439 /* Register to support pickling. 3440 * If this fails, the import of this module will fail because an 3441 * exception will be raised here; should we clear the exception? 3442 */ 3443 copyreg = PyImport_ImportModuleNoBlock("copy_reg"); 3444 if (copyreg != NULL) { 3445 PyObject *func, *pickler; 3446 3447 func = PyObject_GetAttrString(copyreg, "pickle"); 3448 pickle_constructor = PyObject_GetAttrString(module, "sequence2st"); 3449 pickler = PyObject_GetAttrString(module, "_pickler"); 3450 Py_XINCREF(pickle_constructor); 3451 if ((func != NULL) && (pickle_constructor != NULL) 3452 && (pickler != NULL)) { 3453 PyObject *res; 3454 3455 res = PyObject_CallFunctionObjArgs(func, &PyST_Type, pickler, 3456 pickle_constructor, NULL); 3457 Py_XDECREF(res); 3458 } 3459 Py_XDECREF(func); 3460 Py_XDECREF(pickle_constructor); 3461 Py_XDECREF(pickler); 3462 Py_DECREF(copyreg); 3463 } 3464 } 3465