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