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