diff --git a/Modules/parsermodule.c b/Modules/parsermodule.c
index c057135..bc6f516 100644
--- a/Modules/parsermodule.c
+++ b/Modules/parsermodule.c
@@ -1,4 +1,4 @@
-/*  Parser.c
+/*  parsermodule.c
  *
  *  Copyright 1995 by Fred L. Drake, Jr. and Virginia Polytechnic Institute
  *  and State University, Blacksburg, Virginia, USA.  Portions copyright
@@ -23,31 +23,15 @@
 #include "node.h"			/* internal parser structure	  */
 #include "token.h"			/* token definitions		  */
 					/* ISTERMINAL() / ISNONTERMINAL() */
+#include "compile.h"			/* PyNode_Compile()		  */
 
 /*
  *  All the "fudge" declarations are here:
- */
-
-
-/*  These appearantly aren't prototyped in any of the standard Python headers,
- *  either by this name or as 'parse_string()/compile().'  This works at
- *  cutting out the warning, but needs to be done as part of the mainstream
- *  Python headers if this is going to be supported.  It is being handled as
- *  part of the Great Renaming.
- */
-extern node*	 PyParser_SimpleParseString(char*, int);
-extern PyObject* PyNode_Compile(node*, char*);
-
-
-/*  This isn't part of the Python runtime, but it's in the library somewhere.
+ *
+ *  This isn't part of the Python runtime, but it's in the library somewhere.
  *  Where it is varies a bit, so just declare it.
  */
-extern char* strdup(const char*);
-
-
-/*
- *  That's it!  Now, on to the module....
- */
+extern char* strdup();
 
 
 
@@ -66,10 +50,10 @@
 = "This is an interface to Python's internal parser.";
 
 static char*
-parser_version_string = "0.1";
+parser_version_string = "0.3";		/* changed to match python version  */
 
 
-/*  The function below is copyrigthed by Stichting Mathematisch Centrum.
+/*  The function below is copyrigthed by Stichting Mathematisch Centrum.  The
  *  original copyright statement is included below, and continues to apply
  *  in full to the function immediately following.  All other material is
  *  original, copyrighted by Fred L. Drake, Jr. and Virginia Polytechnic
@@ -83,10 +67,10 @@
 
                         All Rights Reserved
 
-Permission to use, copy, modify, and distribute this software and its 
-documentation for any purpose and without fee is hereby granted, 
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
 provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in 
+both that copyright notice and this permission notice appear in
 supporting documentation, and that the names of Stichting Mathematisch
 Centrum or CWI not be used in advertising or publicity pertaining to
 distribution of the software without specific, written prior permission.
@@ -103,42 +87,42 @@
 
 static PyObject*
 node2tuple(n)
-	node *n;
-{
-	if (n == NULL) {
-		Py_INCREF(Py_None);
-		return Py_None;
+     node *n;
+ {
+    if (n == NULL) {
+	Py_INCREF(Py_None);
+	return Py_None;
+    }
+    if (ISNONTERMINAL(TYPE(n))) {
+	int i;
+	PyObject *v, *w;
+	v = PyTuple_New(1 + NCH(n));
+	if (v == NULL)
+	    return v;
+	w = PyInt_FromLong(TYPE(n));
+	if (w == NULL) {
+	    Py_DECREF(v);
+	    return NULL;
 	}
-	if (ISNONTERMINAL(TYPE(n))) {
-		int i;
-		PyObject *v, *w;
-		v = PyTuple_New(1 + NCH(n));
-		if (v == NULL)
-			return v;
-		w = PyInt_FromLong(TYPE(n));
-		if (w == NULL) {
-			Py_DECREF(v);
-			return NULL;
-		}
-		PyTuple_SetItem(v, 0, w);
-		for (i = 0; i < NCH(n); i++) {
-			w = node2tuple(CHILD(n, i));
-			if (w == NULL) {
-				Py_DECREF(v);
-				return NULL;
-			}
-			PyTuple_SetItem(v, i+1, w);
-		}
-		return v;
-	}
-	else if (ISTERMINAL(TYPE(n))) {
-		return Py_BuildValue("(is)", TYPE(n), STR(n));
-	}
-	else {
-		PyErr_SetString(PyExc_SystemError,
-			   "unrecognized parse tree node type");
+	PyTuple_SetItem(v, 0, w);
+	for (i = 0; i < NCH(n); i++) {
+	    w = node2tuple(CHILD(n, i));
+	    if (w == NULL) {
+		Py_DECREF(v);
 		return NULL;
+	    }
+	    PyTuple_SetItem(v, i+1, w);
 	}
+	return v;
+    }
+    else if (ISTERMINAL(TYPE(n))) {
+	return Py_BuildValue("(is)", TYPE(n), STR(n));
+    }
+    else {
+	PyErr_SetString(PyExc_SystemError,
+			"unrecognized parse tree node type");
+	return NULL;
+    }
 }
 /*
  *  End of material copyrighted by Stichting Mathematisch Centrum.
@@ -152,7 +136,8 @@
  *  These should probably go in an external header to allow other extensions
  *  to use them, but then, we really should be using C++ too.  ;-)
  *
- *  The PyAST_FRAGMENT type is not currently supported.
+ *  The PyAST_FRAGMENT type is not currently supported.  Maybe not useful?
+ *  Haven't decided yet.
  */
 
 #define PyAST_EXPR	1
@@ -178,9 +163,8 @@
 } PyAST_Object;
 
 
-staticforward void parser_free(PyAST_Object* ast);
-staticforward int  parser_compare(PyAST_Object* left, PyAST_Object* right);
-staticforward long parser_hash(PyAST_Object* ast);
+staticforward void parser_free();
+staticforward int  parser_compare();
 
 
 /* static */
@@ -209,9 +193,9 @@
 
 static int
 parser_compare_nodes(left, right)
-     node* left;
-     node* right;
-{
+     node *left;
+     node *right;
+ {
     int j;
 
     if (TYPE(left) < TYPE(right))
@@ -249,9 +233,10 @@
  */
 static int
 parser_compare(left, right)
-     PyAST_Object* left;
-     PyAST_Object* right;
-{
+     PyAST_Object *left;
+     PyAST_Object *right;
+ {
+
     if (left == right)
 	return (0);
 
@@ -272,9 +257,10 @@
  */
 static PyObject*
 parser_newastobject(ast, type)
-     node* ast;
-     int   type;
-{
+     node *ast;
+     int type;
+ {
+
     PyAST_Object* o = PyObject_NEW(PyAST_Object, &PyAST_Type);
 
     if (o != 0) {
@@ -293,8 +279,9 @@
  */
 static void
 parser_free(ast)
-     PyAST_Object* ast;
-{
+     PyAST_Object *ast;
+ {
+
     PyNode_Free(ast->ast_node);
     PyMem_DEL(ast);
 
@@ -309,9 +296,10 @@
  */
 static PyObject*
 parser_ast2tuple(self, args)
-     PyObject* self;
-     PyObject* args;
-{
+     PyObject *self;
+     PyObject *args;
+ {
+
     PyObject* ast;
     PyObject* res = 0;
 
@@ -335,15 +323,16 @@
  */
 static PyObject*
 parser_compileast(self, args)
-     PyObject* self;
-     PyObject* args;
-{
+     PyObject *self;
+     PyObject *args;
+ {
+
     PyAST_Object* ast;
     PyObject*     res = 0;
     char*	  str = "<ast>";
 
     if (PyArg_ParseTuple(args, "O!|s", &PyAST_Type, &ast, &str))
-	res = PyNode_Compile(ast->ast_node, str);
+	res = (PyObject*) PyNode_Compile(ast->ast_node, str);
 
     return (res);
 
@@ -359,9 +348,9 @@
  */
 static PyObject*
 parser_isexpr(self, args)
-     PyObject* self;
-     PyObject* args;
-{
+     PyObject *self;
+     PyObject *args;
+ {
     PyAST_Object* ast;
     PyObject* res = 0;
 
@@ -379,13 +368,14 @@
 
 static PyObject*
 parser_issuite(self, args)
-     PyObject* self;
-     PyObject* args;
-{
+     PyObject *self;
+     PyObject *args;
+ {
+
     PyAST_Object* ast;
     PyObject* res = 0;
 
-    if (PyArg_ParseTuple(args, "O!:isexpr", &PyAST_Type, &ast)) {
+    if (PyArg_ParseTuple(args, "O!:issuite", &PyAST_Type, &ast)) {
 	/*
 	 *  Check to see if the AST represents an expression or not.
 	 */
@@ -397,6 +387,20 @@
 }   /* parser_issuite() */
 
 
+/*  err_string(char* message)
+ *
+ *  Sets the error string for an exception of type ParserError.
+ *
+ */
+static void
+err_string(message)
+     char *message;
+ {
+    PyErr_SetString(parser_error, message);
+
+}  /* err_string() */
+
+
 /*  PyObject* parser_do_parse(PyObject* args, int type)
  *
  *  Internal function to actually execute the parse and return the result if
@@ -406,8 +410,9 @@
 static PyObject*
 parser_do_parse(args, type)
      PyObject *args;
-     int      type;
-{
+     int type;
+ {
+
     char*     string = 0;
     PyObject* res    = 0;
 
@@ -419,7 +424,7 @@
 	if (n != 0)
 	    res = parser_newastobject(n, type);
 	else
-	    PyErr_SetString(parser_error, "Could not parse string.");
+	    err_string("Could not parse string.");
     }
     return (res);
 
@@ -436,9 +441,10 @@
  */
 static PyObject*
 parser_expr(self, args)
-     PyObject* self;
-     PyObject* args;
-{
+     PyObject *self;
+     PyObject *args;
+ {
+
     return (parser_do_parse(args, PyAST_EXPR));
 
 }   /* parser_expr() */
@@ -446,9 +452,10 @@
 
 static PyObject*
 parser_suite(self, args)
-     PyObject* self;
-     PyObject* args;
-{
+     PyObject *self;
+     PyObject *args;
+ {
+
     return (parser_do_parse(args, PyAST_SUITE));
 
 }   /* parser_suite() */
@@ -472,9 +479,9 @@
  */
 
 
-staticforward node* build_node_tree(PyObject*);
-staticforward int   validate_expr_tree(node*);
-staticforward int   validate_suite_tree(node*);
+staticforward node* build_node_tree();
+staticforward int   validate_expr_tree();
+staticforward int   validate_file_input();
 
 
 /*  PyObject* parser_tuple2ast(PyObject* self, PyObject* args)
@@ -492,63 +499,63 @@
  */
 static PyObject*
 parser_tuple2ast(self, args)
-     PyObject* self;
-     PyObject* args;
-{
+     PyObject *self;
+     PyObject *args;
+ {
+
     PyObject* ast	= 0;
     PyObject* tuple	= 0;
-    int	      start_sym;
-    int	      next_sym;
 
-    if ((PyTuple_Size(args) == 1)
-	&& (tuple = PyTuple_GetItem(args, 0))
-	&& PyTuple_Check(tuple)
-	&& (PyTuple_Size(tuple) >= 2)
-	&& PyInt_Check(PyTuple_GetItem(tuple, 0))
-	&& PyTuple_Check(PyTuple_GetItem(tuple, 1))
-	&& (PyTuple_Size(PyTuple_GetItem(tuple, 1)) >= 2)
-	&& PyInt_Check(PyTuple_GetItem(PyTuple_GetItem(tuple, 1), 0))) {
+    if ((PyObject_Length(args) == 1)
+	&& (tuple = PySequence_GetItem(args, 0))
+	&& PySequence_Check(tuple)
+	&& (PyObject_Length(tuple) >= 2)
+	&& PyInt_Check(PySequence_GetItem(tuple, 0))
+	&& PySequence_Check(PySequence_GetItem(tuple, 1))
+	&& (PyObject_Length(PySequence_GetItem(tuple, 1)) >= 2)
+	&& PyInt_Check(PySequence_GetItem(PySequence_GetItem(tuple, 1), 0))) {
 
 	/*
 	 *  This might be a valid parse tree, but let's do a quick check
 	 *  before we jump the gun.
 	 */
 
-	start_sym = PyInt_AsLong(PyTuple_GetItem(tuple, 0));
-	next_sym = PyInt_AsLong(PyTuple_GetItem(PyTuple_GetItem(tuple, 1), 0));
+	int start_sym = PyInt_AsLong(PySequence_GetItem(tuple, 0));
 
-	if ((start_sym == eval_input) && (next_sym == testlist)) {
+	if (start_sym == eval_input) {
 	    /*
-	     *  Might be an expression.
+	     *  Might be an eval form.
 	     */
-	    node* expression = build_node_tree(PyTuple_GetItem(args, 0));
+	    node* expression = build_node_tree(PySequence_GetItem(args, 0));
 
-	    puts("Parser.tuple2ast: built eval input tree.");
 	    if ((expression != 0) && validate_expr_tree(expression))
 		ast = parser_newastobject(expression, PyAST_EXPR);
 	}
-	else if ((start_sym == file_input) && (next_sym == stmt)) {
+	else if (start_sym == file_input) {
 	    /*
-	     *  This looks like a suite so far.
+	     *  This looks like an exec form so far.
 	     */
-	    node* suite_tree = build_node_tree(PyTuple_GetItem(args, 0));
+	    node* suite_tree = build_node_tree(PySequence_GetItem(args, 0));
 
-	    puts("Parser.tuple2ast: built file input tree.");
-	    if ((suite_tree != 0) && validate_suite_tree(suite_tree))
+	    if ((suite_tree != 0) && validate_file_input(suite_tree))
 		ast = parser_newastobject(suite_tree, PyAST_SUITE);
 	}
-	/*
-	 *  Make sure we throw an exception on all errors.  We should never
+	else
+	    /*	This is a fragment, and is not yet supported.  Maybe they
+	     *	will be if I find a use for them.
+	     */
+	    err_string("Fragmentary parse trees not supported.");
+
+	/*  Make sure we throw an exception on all errors.  We should never
 	 *  get this, but we'd do well to be sure something is done.
 	 */
-	if ((ast == 0) && !PyErr_Occurred()) {
-	    PyErr_SetString(parser_error, "Unspecified ast error occurred.");
-	}
+	if ((ast == 0) && !PyErr_Occurred())
+	    err_string("Unspecified ast error occurred.");
     }
-    else {
+    else
 	PyErr_SetString(PyExc_TypeError,
 			"parser.tuple2ast(): expected single tuple.");
-    }
+
     return (ast);
 
 }   /* parser_tuple2ast() */
@@ -571,18 +578,17 @@
  */
 static int
 check_terminal_tuple(elem, result)
-     PyObject* elem;
-     node*     result;
-{
+     PyObject *elem;
+     node *result;
+ {
+
     int   res = 0;
     char* str = 0;
 
-    if (PyTuple_Size(elem) != 2) {
+    if (PyObject_Length(elem) != 2)
 	str = "Illegal terminal symbol; node too long.";
-    }
-    else if (!PyString_Check(PyTuple_GetItem(elem, 1))) {
+    else if (!PyString_Check(PySequence_GetItem(elem, 1)))
 	str = "Illegal terminal symbol; expected a string.";
-    }
     else
 	res = 1;
 
@@ -605,30 +611,32 @@
  */
 static node*
 build_node_children(tuple, root, line_num)
-     PyObject* tuple;
-     node*     root;
-     int*      line_num;
-{
-    int len = PyTuple_Size(tuple);
+     PyObject *tuple;
+     node *root;
+     int *line_num;
+ {
+
+    int len = PyObject_Length(tuple);
     int i;
 
     for (i = 1; i < len; ++i) {
 	/* elem must always be a tuple, however simple */
-	PyObject* elem = PyTuple_GetItem(tuple, i);
+	PyObject* elem = PySequence_GetItem(tuple, i);
 	long      type = 0;
 	char*     strn = 0;
 
-	if ((!PyTuple_Check(elem)) || !PyInt_Check(PyTuple_GetItem(elem, 0))) {
+	if ((!PySequence_Check(elem))
+	    || !PyInt_Check(PySequence_GetItem(elem, 0))) {
 	    PyErr_SetObject(parser_error,
 			    Py_BuildValue("(os)", elem,
 					  "Illegal node construct."));
 	    return (0);
 	}
-	type = PyInt_AsLong(PyTuple_GetItem(elem, 0));
+	type = PyInt_AsLong(PySequence_GetItem(elem, 0));
 
 	if (ISTERMINAL(type)) {
 	    if (check_terminal_tuple(elem, root))
-		strn = strdup(PyString_AsString(PyTuple_GetItem(elem, 1)));
+		strn = strdup(PyString_AsString(PySequence_GetItem(elem, 1)));
 	    else
 		return (0);
 	}
@@ -660,10 +668,11 @@
 
 static node*
 build_node_tree(tuple)
-     PyObject* tuple;
-{
+     PyObject *tuple;
+ {
+
     node* res = 0;
-    long  num = PyInt_AsLong(PyTuple_GetItem(tuple, 0));
+    long  num = PyInt_AsLong(PySequence_GetItem(tuple, 0));
 
     if (ISTERMINAL(num)) {
 	/*
@@ -671,7 +680,7 @@
 	 *  Throw an exception now and be done with it.
 	 */
 	tuple = Py_BuildValue("(os)", tuple,
-			      "Illegal ast tuple; cannot start with terminal symbol.");
+		    "Illegal ast tuple; cannot start with terminal symbol.");
 	PyErr_SetObject(parser_error, tuple);
     }
     else if (ISNONTERMINAL(num)) {
@@ -686,22 +695,20 @@
 	    res = 0;
 	}
     }
-    else {
-	/*
-	 *  The tuple is illegal -- if the number is neither TERMINAL nor
+    else
+	/*  The tuple is illegal -- if the number is neither TERMINAL nor
 	 *  NONTERMINAL, we can't use it.
 	 */
 	PyErr_SetObject(parser_error,
 			Py_BuildValue("(os)", tuple,
 				      "Illegal component tuple."));
-    }
+
     return (res);
 
 }   /* build_node_tree() */
 
 
-#define	VALIDATER(n)	static int validate_##n(node*)
-#define	VALIDATE(n)	static int validate_##n(node* tree)
+#define	VALIDATER(n)	static int validate_##n()
 
 
 /*
@@ -714,7 +721,7 @@
 /*
  *  Validation routines used within the validation section:
  */
-staticforward int validate_terminal(node*, int, char*);
+staticforward int validate_terminal();
 
 #define	validate_ampersand(ch)	validate_terminal(ch,	   AMPER, "&")
 #define	validate_circumflex(ch)	validate_terminal(ch, CIRCUMFLEX, "^")
@@ -722,29 +729,30 @@
 #define validate_comma(ch)	validate_terminal(ch,	   COMMA, ",")
 #define validate_dedent(ch)	validate_terminal(ch,	  DEDENT, "")
 #define	validate_equal(ch)	validate_terminal(ch,	   EQUAL, "=")
-#define validate_indent(ch)	validate_terminal(ch,	  INDENT, "")
+#define validate_indent(ch)	validate_terminal(ch,	  INDENT, 0)
 #define validate_lparen(ch)	validate_terminal(ch,	    LPAR, "(")
-#define	validate_newline(ch)	validate_terminal(ch,	 NEWLINE, "")
+#define	validate_newline(ch)	validate_terminal(ch,	 NEWLINE, 0)
 #define validate_rparen(ch)	validate_terminal(ch,	    RPAR, ")")
 #define validate_semi(ch)	validate_terminal(ch,	    SEMI, ";")
 #define	validate_star(ch)	validate_terminal(ch,	    STAR, "*")
 #define	validate_vbar(ch)	validate_terminal(ch,	    VBAR, "|")
+#define validate_doublestar(ch)	validate_terminal(ch, DOUBLESTAR, "**")
+#define	validate_name(ch, str)	validate_terminal(ch,	    NAME, str)
 
-#define	validate_compound_stmt(ch) validate_node(ch)
-#define	validate_name(ch, str)	validate_terminal(ch,    NAME, str)
-#define validate_small_stmt(ch)	validate_node(ch)
-
+#if defined(access_stmt) && defined(accesstype)
+VALIDATER(access_stmt);		VALIDATER(accesstype);
+#endif
+VALIDATER(node);		VALIDATER(small_stmt);
 VALIDATER(class);		VALIDATER(node);
 VALIDATER(parameters);		VALIDATER(suite);
 VALIDATER(testlist);		VALIDATER(varargslist);
 VALIDATER(fpdef);		VALIDATER(fplist);
 VALIDATER(stmt);		VALIDATER(simple_stmt);
-VALIDATER(expr_stmt);
+VALIDATER(expr_stmt);		VALIDATER(power);
 VALIDATER(print_stmt);		VALIDATER(del_stmt);
 VALIDATER(return_stmt);
 VALIDATER(raise_stmt);		VALIDATER(import_stmt);
-VALIDATER(global_stmt);
-VALIDATER(access_stmt);		VALIDATER(accesstype);
+VALIDATER(global_stmt);		VALIDATER(file_input);
 VALIDATER(exec_stmt);		VALIDATER(compound_stmt);
 VALIDATER(while);		VALIDATER(for);
 VALIDATER(try);			VALIDATER(except_clause);
@@ -757,6 +765,7 @@
 VALIDATER(atom);		VALIDATER(lambdef);
 VALIDATER(trailer);		VALIDATER(subscript);
 VALIDATER(exprlist);		VALIDATER(dictmaker);
+VALIDATER(arglist);		VALIDATER(argument);
 
 
 #define	is_even(n)	(((n) & 1) == 0)
@@ -765,16 +774,15 @@
 
 static int
 validate_ntype(n, t)
-     node* n;
-     int   t;
-{
+     node *n;
+     int t;
+ {
     int res = (TYPE(n) == t);
 
     if (!res) {
 	char buffer[128];
-
 	sprintf(buffer, "Expected node type %d, got %d.", t, TYPE(n));
-	PyErr_SetString(parser_error, buffer);
+	err_string(buffer);
     }
     return (res);
 
@@ -782,481 +790,651 @@
 
 
 static int
-validate_terminal(terminal, type, string)
-     node* terminal;
-     int   type;
-     char* string;
-{
-    static char buffer[60];
-    int res = ((TYPE(terminal) == type)
-	       && (strcmp(string, STR(terminal)) == 0));
+validate_numnodes(n, num, name)
+     node *n;
+     int num;
+     const char *const name;
+ {
+    if (NCH(n) != num) {
+	char buff[60];
+	sprintf(buff, "Illegal number of children for %s node.", name);
+	err_string(buff);
+    }
+    return (NCH(n) == num);
 
-    if (!res) {
-	sprintf(buffer, "Illegal NAME: expected \"%s\"", string);
-	PyErr_SetString(parser_error, buffer);
+}   /* validate_numnodes() */
+
+
+static int
+validate_terminal(terminal, type, string)
+     node *terminal;
+     int type;
+     char *string;
+ {
+    int res = (validate_ntype(terminal, type)
+	       && ((string == 0) || (strcmp(string, STR(terminal)) == 0)));
+
+    if (!res && !PyErr_Occurred()) {
+	char buffer[60];
+	sprintf(buffer, "Illegal terminal: expected \"%s\"", string);
+	err_string(buffer);
     }
     return (res);
 
 }   /* validate_terminal() */
 
 
-VALIDATE(class) {
+/*  VALIDATE(class)
+ *
+ *  classdef:
+ *	'class' NAME ['(' testlist ')'] ':' suite
+ */
+validate_class(tree)
+    node *tree;
+{
     int nch = NCH(tree);
-    int res = (((nch == 4)
-		|| ((nch == 7)
-		    && validate_lparen(CHILD(tree, 2))
-		    && validate_ntype(CHILD(tree, 3), testlist)
-		    && validate_testlist(CHILD(tree, 3))
-		    && validate_rparen(CHILD(tree, 4))))
-		&& validate_terminal(CHILD(tree, 0),	NAME, "class")
-		&& validate_ntype(CHILD(tree, 1), NAME)
-		&& validate_colon(CHILD(tree, nch - 2))
-		&& validate_ntype(CHILD(tree, nch - 1), suite)
-		&& validate_suite(CHILD(tree, nch - 1)));
+    int res = validate_ntype(tree, classdef) && ((nch == 4) || (nch == 7));
 
-    if (!res) {
-	if ((nch >= 2)
-	    && validate_ntype(CHILD(tree, 1), NAME)) {
-	    char buffer[128];
-
-	    sprintf(buffer, "Illegal classdef tuple for %s",
-		    STR(CHILD(tree, 1)));
-	    PyErr_SetString(parser_error, buffer);
-	}
-	else {
-	    PyErr_SetString(parser_error, "Illegal classdef tuple.");
-	}
+    if (res) {
+	res = (validate_name(CHILD(tree, 0), "class")
+	       && validate_ntype(CHILD(tree, 1), NAME)
+	       && validate_colon(CHILD(tree, nch - 2))
+	       && validate_suite(CHILD(tree, nch - 1)));
+    }
+    else
+	validate_numnodes(tree, 4, "class");
+    if (res && (nch == 7)) {
+	res = (validate_lparen(CHILD(tree, 2))
+	       && validate_testlist(CHILD(tree, 3))
+	       && validate_rparen(CHILD(tree, 4)));
     }
     return (res);
 
 }   /* validate_class() */
 
 
-static int
-validate_elif(elif_node, test_node, colon_node, suite_node)
-     node* elif_node;
-     node* test_node;
-     node* colon_node;
-     node* suite_node;
+/*  if_stmt:
+ *	'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]
+ */
+validate_if(tree)
+    node *tree;
 {
-    return (validate_ntype(test_node, test)
-	    && validate_ntype(suite_node, suite)
-	    && validate_name(elif_node, "elif")
-	    && validate_colon(colon_node)
-	    && validate_node(test_node)
-	    && validate_suite(suite_node));
-
-}   /* validate_elif() */
-
-
-static int
-validate_else(else_node, colon_node, suite_node)
-     node* else_node;
-     node* colon_node;
-     node* suite_node;
-{
-    return (validate_ntype(suite_node, suite)
-	    && validate_name(else_node, "else")
-	    && validate_colon(colon_node)
-	    && validate_suite(suite_node));
-
-}   /* validate_else() */
-
-
-VALIDATE(if) {
     int nch = NCH(tree);
-    int res = ((nch >= 4)
-	       && validate_ntype(CHILD(tree, 1), test)
-	       && validate_ntype(CHILD(tree, 3), suite)
+    int res = (validate_ntype(tree, if_stmt)
+	       && (nch >= 4)
 	       && validate_name(CHILD(tree, 0), "if")
+	       && validate_test(CHILD(tree, 1))
 	       && validate_colon(CHILD(tree, 2))
-	       && validate_parameters(CHILD(tree, 1))
 	       && validate_suite(CHILD(tree, 3)));
 
     if (res && ((nch % 4) == 3)) {
-	/*
-	 *  There must be a single 'else' clause, and maybe a series
-	 *  of 'elif' clauses.
-	 */
-	res = validate_else(CHILD(tree, nch-3), CHILD(tree, nch-2),
-			    CHILD(tree, nch-1));
+	/*  ... 'else' ':' suite  */
+	res = (validate_name(CHILD(tree, nch - 3), "else")
+	       && validate_colon(CHILD(tree, nch - 2))
+	       && validate_suite(CHILD(tree, nch - 1)));
 	nch -= 3;
     }
+    else if (!res && !PyErr_Occurred())
+	validate_numnodes(tree, 4, "if");
     if ((nch % 4) != 0)
-	res = 0;
+	/* Will catch the case for nch < 4 */
+	res = validate_numnodes(tree, 0, "if");
     else if (res && (nch > 4)) {
-	/*
-	 *  There might be a series of 'elif' clauses.
-	 */
+	/*  ... ('elif' test ':' suite)+ ...  */
 	int j = 4;
 	while ((j < nch) && res) {
-	    res = validate_elif(CHILD(tree, j),   CHILD(tree, j+1),
-				CHILD(tree, j+2), CHILD(tree, j+3));
+	    res = (validate_name(CHILD(tree, j), "elif")
+		   && validate_colon(CHILD(tree, j + 2))
+		   && validate_test(CHILD(tree, j + 1))
+		   && validate_suite(CHILD(tree, j + 3)));
 	    j += 4;
 	}
     }
-    if (!res && !PyErr_Occurred()) {
-	PyErr_SetString(parser_error, "Illegal 'if' statement found.");
-    }
     return (res);
 
 }   /* validate_if() */
 
 
-VALIDATE(parameters) {
-    int res = 1;
+/*  parameters:
+ *	'(' [varargslist] ')'
+ *
+ */
+validate_parameters(tree)
+    node *tree;
+{
     int nch = NCH(tree);
+    int res = validate_ntype(tree, parameters) && ((nch == 2) || (nch == 3));
 
-    res = (((nch == 2)
-	    || ((nch == 3)
-		&& validate_varargslist(CHILD(tree, 1))))
-	   && validate_lparen(CHILD(tree, 0))
-	   && validate_rparen(CHILD(tree, nch - 1)));
+    if (res) {
+	res = (validate_lparen(CHILD(tree, 0))
+	       && validate_rparen(CHILD(tree, nch - 1)));
+	if (res && (nch == 3))
+	    res = validate_varargslist(CHILD(tree, 1));
+    }
+    else
+	validate_numnodes(tree, 2, "parameters");
 
     return (res);
 
 }   /* validate_parameters() */
 
 
-VALIDATE(suite) {
-    int res = 1;
+/*  VALIDATE(suite)
+ *
+ *  suite:
+ *	simple_stmt
+ *    | NEWLINE INDENT stmt+ DEDENT
+ */
+validate_suite(tree)
+    node *tree;
+{
     int nch = NCH(tree);
+    int res = (validate_ntype(tree, suite) && ((nch == 1) || (nch >= 4)));
 
-    if (nch == 1) {
-	res = (validate_ntype(CHILD(tree, 0), simple_stmt)
-	       && validate_simple_stmt(CHILD(tree, 0)));
-    }
-    else {
-	res = ((nch >= 5)
-	       && validate_newline(CHILD(tree, 0))
+    if (res && (nch == 1))
+	res = validate_simple_stmt(CHILD(tree, 0));
+    else if (res) {
+	/*  NEWLINE INDENT stmt+ DEDENT  */
+	res = (validate_newline(CHILD(tree, 0))
 	       && validate_indent(CHILD(tree, 1))
+	       && validate_stmt(CHILD(tree, 2))
 	       && validate_dedent(CHILD(tree, nch - 1)));
 
-	if (res) {
-	    int i = 2;
-
-	    while (TYPE(CHILD(tree, i)) == NEWLINE)
-		++i;
-	    res = (validate_ntype(CHILD(tree, i), stmt)
-		   && validate_stmt(CHILD(tree, i)));
-
-	    if (res) {
-		++i;
-		while (TYPE(CHILD(tree, i)) == NEWLINE)
-		    ++i;
-
-		while (res && (TYPE(CHILD(tree, i)) != DEDENT)) {
-		    res = (validate_ntype(CHILD(tree, i), stmt)
-			   && validate_stmt(CHILD(tree, i)));
-
-		    if (res) {
-			++i;
-			while (TYPE(CHILD(tree, i)) == NEWLINE)
-			    ++i;
-		    }
-		}
-	    }
+	if (res && (nch > 4)) {
+	    int i = 3;
+	    --nch;			/* forget the DEDENT	 */
+	    for ( ; res && (i < nch); ++i)
+		res = validate_stmt(CHILD(tree, i));
 	}
+	else if (nch < 4)
+	    validate_numnodes(tree, 4, "suite");
     }
     return (res);
 
 }   /* validate_suite() */
 
 
-VALIDATE(testlist) {
+validate_testlist(tree)
+    node *tree;
+{
     int i;
     int nch = NCH(tree);
-    int res = ((nch >= 1)
-	       && (is_odd(nch)
-		   || validate_comma(CHILD(tree, nch - 1))));
+    int res = validate_ntype(tree, testlist) && (nch >= 1);
 
-    /*
-     *	If there are an even, non-zero number of children, the last one
+    /*	If there are an even, non-zero number of children, the last one
      *	absolutely must be a comma.  Why the trailing comma is allowed,
      *	I have no idea!
      */
-    if ((res) && is_odd(nch)) {
+    if (res && is_even(nch))
+	res = validate_comma(CHILD(tree, --nch));
+
+    if (res) {
 	/*
 	 *  If the number is odd, the last is a test, and can be
 	 *  verified.  What's left, if anything, can be verified
 	 *  as a list of [test, comma] pairs.
 	 */
 	--nch;
-	res = (validate_ntype(CHILD(tree, nch), test)
-	       && validate_test(CHILD(tree, nch)));
+	res = validate_test(CHILD(tree, nch));
     }
-    for (i = 0; res && (i < nch); i += 2) {
-	res = (validate_ntype(CHILD(tree, i), test)
-	       && validate_test(CHILD(tree, i))
+    for (i = 0; res && (i < nch); i += 2)
+	res = (validate_test(CHILD(tree, i))
 	       && validate_comma(CHILD(tree, i + 1)));
-    }
+
     return (res);
 
 }   /* validate_testlist() */
 
 
-VALIDATE(varargslist) {
+/*  VALIDATE(varargslist)
+ *
+ *  varargslist:
+ *	(fpdef ['=' test] ',')* ('*' NAME [',' '*' '*' NAME] | '*' '*' NAME)
+ *    | fpdef ['=' test] (',' fpdef ['=' test])* [',']
+ *
+ *      (fpdef ['=' test] ',')*
+ *           ('*' NAME [',' ('**'|'*' '*') NAME]
+ *         | ('**'|'*' '*') NAME)
+ *    | fpdef ['=' test] (',' fpdef ['=' test])* [',']
+ *
+ */
+validate_varargslist(tree)
+    node *tree;
+{
     int nch = NCH(tree);
-    int res = (nch != 0);
+    int res = validate_ntype(tree, varargslist) && (nch != 0);
 
-    if (res && (TYPE(CHILD(tree, 0)) == fpdef)) {
+    if (res && (nch >= 2) && (TYPE(CHILD(tree, nch - 1)) == NAME)) {
+	/*  (fpdef ['=' test] ',')*
+	 *  ('*' NAME [',' '*' '*' NAME] | '*' '*' NAME)
+	 */
 	int pos = 0;
+	int remaining = nch;
 
-	while (res && (pos < nch)) {
-	    res = (validate_ntype(CHILD(tree, pos), fpdef)
-		   && validate_fpdef(CHILD(tree, pos)));
-	    ++pos;
-	    if (res && (pos < nch) && (TYPE(CHILD(tree, pos)) == EQUAL)) {
-		res = ((pos + 1 < nch)
-		       && validate_ntype(CHILD(tree, pos + 1), test)
-		       && validate_test(CHILD(tree, pos + 1)));
+	while (res && (TYPE(CHILD(tree, pos)) == fpdef)) {
+	    res = validate_fpdef(CHILD(tree, pos));
+	    if (res) {
+		if (TYPE(CHILD(tree, pos + 1)) == EQUAL) {
+		    res = validate_test(CHILD(tree, pos + 2));
+		    pos += 2;
+		}
+		res = res && validate_comma(CHILD(tree, pos + 1));
 		pos += 2;
 	    }
-	    if (res && (pos < nch)) {
-		res = validate_comma(CHILD(tree, pos));
-		++pos;
+	}
+	if (res) {
+	    remaining = nch - pos;
+	    res = ((remaining == 2) || (remaining == 3)
+		   || (remaining == 5) || (remaining == 6));
+	    if (!res)
+		validate_numnodes(tree, 2, "varargslist");
+	    else if (TYPE(CHILD(tree, pos)) == DOUBLESTAR)
+		return ((remaining == 2)
+			&& validate_ntype(CHILD(tree, pos+1), NAME));
+	    else {
+		res = validate_star(CHILD(tree, pos++));
+		--remaining;
+	    }
+	}
+	if (res) {
+	    if (remaining == 2) {
+		res = (validate_star(CHILD(tree, pos))
+		       && validate_ntype(CHILD(tree, pos + 1), NAME));
+	    }
+	    else {
+		res = validate_ntype(CHILD(tree, pos++), NAME);
+		if (res && (remaining >= 4)) {
+		    res = validate_comma(CHILD(tree, pos));
+		    if (--remaining == 3)
+			res == (validate_star(CHILD(tree, pos + 1))
+				&& validate_star(CHILD(tree, pos + 2)));
+		    else
+			validate_ntype(CHILD(tree, pos + 1), DOUBLESTAR);
+		}
+	    }
+	}
+	if (!res && !PyErr_Occurred())
+	    err_string("Incorrect validation of variable arguments list.");
+    }
+    else if (res) {
+	/*  fpdef ['=' test] (',' fpdef ['=' test])* [',']  */
+	if (TYPE(CHILD(tree, nch - 1)) == COMMA)
+	    --nch;
+
+	/*  fpdef ['=' test] (',' fpdef ['=' test])*  */
+	res = (is_odd(nch)
+	       && validate_fpdef(CHILD(tree, 0)));
+
+	if (res && (nch > 1)) {
+	    int pos = 1;
+	    if (TYPE(CHILD(tree, 1)) == EQUAL) {
+		res = validate_test(CHILD(tree, 2));
+		pos += 2;
+	    }
+	    /*  ... (',' fpdef ['=' test])*  */
+	    for ( ; res && (pos < nch); pos += 2) {
+		/* ',' fpdef */
+		res = (validate_comma(CHILD(tree, pos))
+		       && validate_fpdef(CHILD(tree, pos + 1)));
+		if (res
+		    && ((nch - pos) > 2)
+		    && (TYPE(CHILD(tree, pos + 2)) == EQUAL)) {
+		    /* ['=' test] */
+		    res = validate_test(CHILD(tree, pos + 3));
+		    pos += 2;
+		}
 	    }
 	}
     }
-    else {
-	int pos = 0;
+    else
+	err_string("Improperly formed argument list.");
 
-	res = ((nch > 1)
-	       && ((nch & 1) == 0)
-	       && validate_star(CHILD(tree, nch - 2))
-	       && validate_ntype(CHILD(tree, nch - 1), NAME));
-
-	nch -= 2;
-	while (res && (pos < nch)) {
-	    /*
-	     *  Sequence of:	fpdef ['=' test] ','
-	     */
-	    res = (validate_ntype(CHILD(tree, pos), fpdef)
-		   && validate_fpdef(CHILD(tree, pos))
-		   && ((TYPE(CHILD(tree, pos + 1)) == COMMA)
-		       || (((pos + 2) < nch)
-			   && validate_equal(CHILD(tree, pos + 1))
-			   && validate_ntype(CHILD(tree, pos + 2), test)
-			   && validate_test(CHILD(tree, pos + 2))
-			   && validate_comma(CHILD(tree, pos + 3)))));
-	}
-    }
     return (res);
 
 }   /* validate_varargslist() */
 
 
-VALIDATE(fpdef) {
+/*  VALIDATE(fpdef)
+ *
+ *  fpdef:
+ *	NAME
+ *    | '(' fplist ')'
+ */
+validate_fpdef(tree)
+    node *tree;
+{
     int nch = NCH(tree);
+    int res = validate_ntype(tree, fpdef);
 
-    return (((nch == 1)
-	     && validate_ntype(CHILD(tree, 0), NAME))
-	    || ((nch == 3)
-		&& validate_lparen(CHILD(tree, 0))
-		&& validate_fplist(CHILD(tree, 1))
-		&& validate_rparen(CHILD(tree, 2))));
+    if (res) {
+	if (nch == 1)
+	    res = validate_ntype(CHILD(tree, 0), NAME);
+	else if (nch == 3)
+	    res = (validate_lparen(CHILD(tree, 0))
+		   && validate_fplist(CHILD(tree, 1))
+		   && validate_rparen(CHILD(tree, 2)));
+	else
+	    validate_numnodes(tree, 1, "fpdef");
+    }
+    return (res);
 
 } /* validate_fpdef() */
 
 
-VALIDATE(fplist) {
+validate_fplist(tree)
+    node *tree;
+{
     int j;
     int nch = NCH(tree);
-    int res = ((nch != 0) && validate_fpdef(CHILD(tree, 0)));
+    int res = (validate_ntype(tree, fplist)
+	       && (nch != 0) && validate_fpdef(CHILD(tree, 0)));
 
-    if (res && is_even(nch)) {
-	res = validate_comma(CHILD(tree, nch - 1));
-	--nch;
-    }
-    for (j = 1; res && (j < nch); j += 2) {
+    if (res && is_even(nch))
+	res = validate_comma(CHILD(tree, --nch));
+
+    for (j = 1; res && (j < nch); j += 2)
 	res = (validate_comma(CHILD(tree, j))
 	       && validate_fpdef(CHILD(tree, j + 1)));
-    }
+
     return (res);
 
 }   /* validate_fplist() */
 
 
-VALIDATE(stmt) {
-    int nch = NCH(tree);
+/*  simple_stmt | compound_stmt
+ *
+ */
+validate_stmt(tree)
+    node *tree;
+{
+    int res = (validate_ntype(tree, stmt)
+	       && validate_numnodes(tree, 1, "stmt"));
 
-    return ((nch == 1)
-	    && (((TYPE(CHILD(tree, 0)) == simple_stmt)
-		 && validate_simple_stmt(CHILD(tree, 0)))
-		|| (validate_ntype(CHILD(tree, 0), compound_stmt)
-		    && validate_compound_stmt(CHILD(tree, 0)))));
+    if (res) {
+	tree = CHILD(tree, 0);
+
+	if (TYPE(tree) == simple_stmt)
+	    res = validate_simple_stmt(tree);
+	else
+	    res = validate_compound_stmt(tree);
+    }
+    return (res);
 
 }   /* validate_stmt() */
 
 
-VALIDATE(simple_stmt) {
+/*  small_stmt (';' small_stmt)* [';'] NEWLINE
+ *
+ */
+validate_simple_stmt(tree)
+    node *tree;
+{
     int nch = NCH(tree);
-    int res = ((nch >= 2)
-	       && validate_ntype(CHILD(tree, 0), small_stmt)
+    int res = (validate_ntype(tree, simple_stmt)
+	       && (nch >= 2)
 	       && validate_small_stmt(CHILD(tree, 0))
 	       && validate_newline(CHILD(tree, nch - 1)));
 
-    --nch;			/* forget the NEWLINE */
-    if (res && (nch >= 2)) {
-	if (TYPE(CHILD(tree, nch - 1)) == SEMI)
-	    --nch;
-    }
+    if (nch < 2)
+	res = validate_numnodes(tree, 2, "simple_stmt");
+    --nch;				/* forget the NEWLINE	 */
+    if (res && is_even(nch))
+	res = validate_semi(CHILD(tree, --nch));
     if (res && (nch > 2)) {
 	int i;
 
-	for (i = 1; res && (i < nch); i += 2) {
+	for (i = 1; res && (i < nch); i += 2)
 	    res = (validate_semi(CHILD(tree, i))
-		   && validate_ntype(CHILD(tree, i + 1), small_stmt)
 		   && validate_small_stmt(CHILD(tree, i + 1)));
-	}
     }
     return (res);
 
 }   /* validate_simple_stmt() */
 
 
-VALIDATE(expr_stmt) {
+validate_small_stmt(tree)
+    node *tree;
+{
+    int nch = NCH(tree);
+    int	res = (validate_numnodes(tree, 1, "small_stmt")
+	       && ((TYPE(CHILD(tree, 0)) == expr_stmt)
+		   || (TYPE(CHILD(tree, 0)) == print_stmt)
+		   || (TYPE(CHILD(tree, 0)) == del_stmt)
+		   || (TYPE(CHILD(tree, 0)) == pass_stmt)
+		   || (TYPE(CHILD(tree, 0)) == flow_stmt)
+		   || (TYPE(CHILD(tree, 0)) == import_stmt)
+		   || (TYPE(CHILD(tree, 0)) == global_stmt)
+#if defined(access_stmt) && defined(accesstype)
+		   || (TYPE(CHILD(tree, 0)) == access_stmt)
+#endif
+		   || (TYPE(CHILD(tree, 0)) == exec_stmt)));
+
+    if (res)
+	res = validate_node(CHILD(tree, 0));
+    else if (nch == 1) {
+	char buffer[60];
+	sprintf(buffer, "Unrecognized child node of small_stmt: %d.",
+		TYPE(CHILD(tree, 0)));
+	err_string(buffer);
+    }
+    return (res);
+
+}   /* validate_small_stmt */
+
+
+/*  compound_stmt:
+ *	if_stmt | while_stmt | for_stmt | try_stmt | funcdef | classdef
+ */
+validate_compound_stmt(tree)
+    node *tree;
+{
+    int res = (validate_ntype(tree, compound_stmt)
+	       && validate_numnodes(tree, 1, "compound_stmt"));
+
+    if (!res)
+	return (0);
+
+    tree = CHILD(tree, 0);
+    res = ((TYPE(tree) == if_stmt)
+	   || (TYPE(tree) == while_stmt)
+	   || (TYPE(tree) == for_stmt)
+	   || (TYPE(tree) == try_stmt)
+	   || (TYPE(tree) == funcdef)
+	   || (TYPE(tree) == classdef));
+    if (res)
+	res = validate_node(tree);
+    else {
+	char buffer[60];
+	sprintf(buffer, "Illegal compound statement type: %d.", TYPE(tree));
+	err_string(buffer);
+    }
+    return (res);
+
+}   /* validate_compound_stmt() */
+
+
+validate_expr_stmt(tree)
+    node *tree;
+{
     int j;
     int nch = NCH(tree);
-    int res = (is_odd(nch)
-	       && (validate_testlist(CHILD(tree, 0))));
+    int res = (validate_ntype(tree, expr_stmt)
+	       && is_odd(nch)
+	       && validate_testlist(CHILD(tree, 0)));
 
-    for (j = 1; res && (j < nch); j += 2) {
+    for (j = 1; res && (j < nch); j += 2)
 	res = (validate_equal(CHILD(tree, j))
-	       && validate_ntype(CHILD(tree, j + 1), testlist)
 	       && validate_testlist(CHILD(tree, j + 1)));
-    }
+
     return (res);
 
 }   /* validate_expr_stmt() */
 
 
-VALIDATE(print_stmt) {
+/*  print_stmt:
+ *
+ *	'print' (test ',')* [test]
+ *
+ */
+validate_print_stmt(tree)
+    node *tree;
+{
     int j;
     int nch = NCH(tree);
-    int res = ((nch != 0)
-	       && is_even(nch)
-	       && validate_name(CHILD(tree, 0), "print")
-	       && validate_ntype(CHILD(tree, 1), test)
-	       && validate_test(CHILD(tree, 1)));
-    
-    for (j = 2; res && (j < nch); j += 2) {
-	res = (validate_comma(CHILD(tree, j))
-	       && validate_ntype(CHILD(tree, j + 1), test)
-	       && validate_test(CHILD(tree, 1)));
+    int res = (validate_ntype(tree, print_stmt)
+	       && (nch != 0)
+	       && validate_name(CHILD(tree, 0), "print"));
+
+    if (res && is_even(nch)) {
+	res = validate_test(CHILD(tree, nch - 1));
+	--nch;
     }
+    else if (!res && !PyErr_Occurred())
+	validate_numnodes(tree, 1, "print_stmt");
+    for (j = 1; res && (j < nch); j += 2)
+	res = (validate_test(CHILD(tree, j))
+	       && validate_ntype(CHILD(tree, j + 1), COMMA));
+
     return (res);
 
 }   /* validate_print_stmt() */
 
 
-VALIDATE(del_stmt) {
-
-    return ((NCH(tree) == 2)
+validate_del_stmt(tree)
+    node *tree;
+{
+    return (validate_numnodes(tree, 2, "del_stmt")
 	    && validate_name(CHILD(tree, 0), "del")
-	    && validate_ntype(CHILD(tree, 1), exprlist)
 	    && validate_exprlist(CHILD(tree, 1)));
 
 }   /* validate_del_stmt() */
 
 
-VALIDATE(return_stmt) {
+validate_return_stmt(tree)
+    node *tree;
+{
     int nch = NCH(tree);
-    int res = (((nch == 1)
-		|| (nch == 2))
+    int res = (validate_ntype(tree, return_stmt)
+	       && ((nch == 1) || (nch == 2))
 	       && validate_name(CHILD(tree, 0), "return"));
 
-    if (res && (nch == 2)) {
-	res = (validate_ntype(CHILD(tree, 1), testlist)
-	       && validate_testlist(CHILD(tree, 1)));
-    }
+    if (res && (nch == 2))
+	res = validate_testlist(CHILD(tree, 1));
+
     return (res);
 
 }   /* validate_return_stmt() */
 
 
-VALIDATE(raise_stmt) {
+validate_raise_stmt(tree)
+    node *tree;
+{
     int nch = NCH(tree);
-    int res = (((nch == 2) || (nch == 4))
-	       && validate_name(CHILD(tree, 0), "raise")
-	       && validate_ntype(CHILD(tree, 1), test)
-	       && validate_test(CHILD(tree, 1)));
+    int res = (validate_ntype(tree, raise_stmt)
+	       && ((nch == 2) || (nch == 4) || (nch == 6)));
 
-    if (res && (nch == 4)) {
-	res = (validate_comma(CHILD(tree, 2))
-	       && (TYPE(CHILD(tree, 3)) == test)
-	       && validate_test(CHILD(tree, 3)));
+    if (res) {
+	res = (validate_name(CHILD(tree, 0), "raise")
+	       && validate_test(CHILD(tree, 1)));
+	if (res && nch > 2) {
+	    res = (validate_comma(CHILD(tree, 2))
+		   && validate_test(CHILD(tree, 3)));
+	    if (res && (nch > 4))
+		res = (validate_comma(CHILD(tree, 4))
+		       && validate_test(CHILD(tree, 5)));
+	}
     }
+    else
+	validate_numnodes(tree, 2, "raise");
+    if (res && (nch == 4))
+	res = (validate_comma(CHILD(tree, 2))
+	       && validate_test(CHILD(tree, 3)));
+
     return (res);
 
 }   /* validate_raise_stmt() */
 
 
-VALIDATE(import_stmt) {
+/*  import_stmt:
+ *
+ *    'import' dotted_name (',' dotted_name)*
+ *  | 'from' dotted_name 'import' ('*' | NAME (',' NAME)*)
+ */
+validate_import_stmt(tree)
+    node *tree;
+{
     int nch = NCH(tree);
-    int res = ((nch >= 2)
+    int res = (validate_ntype(tree, import_stmt)
+	       && (nch >= 2) && is_even(nch)
 	       && validate_ntype(CHILD(tree, 0), NAME)
-	       && validate_ntype(CHILD(tree, 1), NAME));
+	       && validate_ntype(CHILD(tree, 1), dotted_name));
 
     if (res && (strcmp(STR(CHILD(tree, 0)), "import") == 0)) {
-	res = is_even(nch);
-	if (res) {
-	    int j;
+	int j;
 
-	    for (j = 2; res && (j < nch); j += 2) {
-		res = (validate_comma(CHILD(tree, j))
-		       && validate_ntype(CHILD(tree, j + 1), NAME));
-	    }
-	}
+	for (j = 2; res && (j < nch); j += 2)
+	    res = (validate_comma(CHILD(tree, j))
+		   && validate_ntype(CHILD(tree, j + 1), dotted_name));
     }
     else if (res && validate_name(CHILD(tree, 0), "from")) {
-	res = ((nch >= 4)
-	       && is_even(nch)
+	res = ((nch >= 4) && is_even(nch)
 	       && validate_name(CHILD(tree, 2), "import"));
 	if (nch == 4) {
 	    res = ((TYPE(CHILD(tree, 3)) == NAME)
-		   || validate_ntype(CHILD(tree, 3), STAR));
+		   || (TYPE(CHILD(tree, 3)) == STAR));
+	    if (!res)
+		err_string("Illegal import statement.");
 	}
 	else {
-	    /* 'from' NAME 'import' NAME (',' NAME)* */
+	    /*  'from' NAME 'import' NAME (',' NAME)+  */
 	    int j;
-
 	    res = validate_ntype(CHILD(tree, 3), NAME);
-	    for (j = 4; res && (j < nch); j += 2) {
+	    for (j = 4; res && (j < nch); j += 2)
 		res = (validate_comma(CHILD(tree, j))
 		       && validate_ntype(CHILD(tree, j + 1), NAME));
-	    }
 	}
     }
-    else {
+    else
 	res = 0;
-    }
+
     return (res);
 
 }   /* validate_import_stmt() */
 
 
-VALIDATE(global_stmt) {
+validate_global_stmt(tree)
+    node *tree;
+{
     int j;
     int nch = NCH(tree);
-    int res = (is_even(nch)
-	       && validate_name(CHILD(tree, 0), "global")
-	       && validate_ntype(CHILD(tree, 1), NAME));
+    int res = (validate_ntype(tree, global_stmt)
+	       && is_even(nch) && (nch >= 2));
 
-    for (j = 2; res && (j < nch); j += 2) {
+    if (res)
+	res = (validate_name(CHILD(tree, 0), "global")
+	       && validate_ntype(CHILD(tree, 1), NAME));
+    for (j = 2; res && (j < nch); j += 2)
 	res = (validate_comma(CHILD(tree, j))
 	       && validate_ntype(CHILD(tree, j + 1), NAME));
-    }
+
     return (res);
 
 }   /* validate_global_stmt() */
 
 
-VALIDATE(access_stmt) {
+#if defined(access_stmt) && defined(accesstype)
+/*  VALIDATE(accesstype)
+ *
+ *  This should be removed as soon as the 'access' statement is actually
+ *  removed from the language.  The conditional compilation should help.
+ */
+validate_access_stmt(tree)
+    node *tree;
+{
     int pos = 3;
     int nch = NCH(tree);
-    int res = ((nch >= 4)
-	       && is_even(nch)
+    int res = (validate_ntype(tree, access_stmt)
+	       && (nch >= 4) && is_even(nch)
 	       && validate_name(CHILD(tree, 0), "access")
 	       && validate_accesstype(CHILD(tree, nch - 1)));
 
@@ -1272,245 +1450,268 @@
 		   && (pos += 2));
 	}
     }
-    else {
+    else
 	res = validate_star(CHILD(tree, 1));
-    }
-    res = (res && validate_colon(CHILD(tree, pos - 1)));
 
-    for (; res && (pos < (nch - 1)); pos += 2) {
+    res = (res && validate_colon(CHILD(tree, pos - 1)));
+    for (; res && (pos < (nch - 1)); pos += 2)
 	res = (validate_accesstype(CHILD(tree, pos))
 	       && validate_comma(CHILD(tree, pos + 1)));
-    }
+
     return (res && (pos == (nch - 1)));
 
 }   /* validate_access_stmt() */
 
 
-VALIDATE(accesstype) {
+validate_accesstype(tree)
+    node *tree;
+{
     int nch = NCH(tree);
-    int res = (nch >= 1);
+    int res = validate_ntype(tree, accesstype) && (nch >= 1);
     int i;
 
-    for (i = 0; res && (i < nch); ++i) {
+    for (i = 0; res && (i < nch); ++i)
 	res = validate_ntype(CHILD(tree, i), NAME);
-    }
+
     return (res);
 
 }   /* validate_accesstype() */
+#endif
 
 
-VALIDATE(exec_stmt) {
+/*  exec_stmt:
+ *
+ *  'exec' expr ['in' test [',' test]]
+ */
+validate_exec_stmt(tree)
+    node *tree;
+{
     int nch = NCH(tree);
-    int res = (((nch == 2) || (nch == 4) || (nch == 6))
+    int res = (validate_ntype(tree, exec_stmt)
+	       && ((nch == 2) || (nch == 4) || (nch == 6))
 	       && validate_name(CHILD(tree, 0), "exec")
 	       && validate_expr(CHILD(tree, 1)));
 
-    if (res && (nch > 2)) {
+    if (!res && !PyErr_Occurred())
+	err_string("Illegal exec statement.");
+    if (res && (nch > 2))
 	res = (validate_name(CHILD(tree, 2), "in")
 	       && validate_test(CHILD(tree, 3)));
-    }
-    if (res && (nch > 4)) {
+    if (res && (nch == 6))
 	res = (validate_comma(CHILD(tree, 4))
 	       && validate_test(CHILD(tree, 5)));
-    }
+
     return (res);
 
 }   /* validate_exec_stmt() */
 
 
-VALIDATE(while) {
+validate_while(tree)
+    node *tree;
+{
     int nch = NCH(tree);
-    int res = (((nch == 4) || (nch == 7))
+    int res = (validate_ntype(tree, while_stmt)
+	       && ((nch == 4) || (nch == 7))
 	       && validate_name(CHILD(tree, 0), "while")
-	       && validate_ntype(CHILD(tree, 1), test)
 	       && validate_test(CHILD(tree, 1))
 	       && validate_colon(CHILD(tree, 2))
-	       && validate_ntype(CHILD(tree, 3), suite)
 	       && validate_suite(CHILD(tree, 3)));
 
-    if (res && (nch == 7)) {
+    if (res && (nch == 7))
 	res = (validate_name(CHILD(tree, 4), "else")
 	       && validate_colon(CHILD(tree, 5))
-	       && validate_ntype(CHILD(tree, 6), suite)
 	       && validate_suite(CHILD(tree, 6)));
-    }
+
     return (res);
 
 }   /* validate_while() */
 
 
-VALIDATE(for) {
+validate_for(tree)
+    node *tree;
+{
     int nch = NCH(tree);
-    int res = (((nch == 6) || (nch == 9))
+    int res = (validate_ntype(tree, for_stmt)
+	       && ((nch == 6) || (nch == 9))
 	       && validate_name(CHILD(tree, 0), "for")
-	       && validate_ntype(CHILD(tree, 1), exprlist)
 	       && validate_exprlist(CHILD(tree, 1))
 	       && validate_name(CHILD(tree, 2), "in")
-	       && validate_ntype(CHILD(tree, 3), testlist)
 	       && validate_testlist(CHILD(tree, 3))
 	       && validate_colon(CHILD(tree, 4))
-	       && validate_ntype(CHILD(tree, 5), suite)
 	       && validate_suite(CHILD(tree, 5)));
 
-    if (res && (nch == 9)) {
+    if (res && (nch == 9))
 	res = (validate_name(CHILD(tree, 6), "else")
 	       && validate_colon(CHILD(tree, 7))
-	       && validate_ntype(CHILD(tree, 8), suite)
 	       && validate_suite(CHILD(tree, 8)));
-    }
+
     return (res);
 
 }   /* validate_for() */
 
 
-VALIDATE(try) {
+/*  try_stmt:
+ *	'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
+ *    | 'try' ':' suite 'finally' ':' suite
+ *
+ */
+validate_try(tree)
+    node *tree;
+{
     int nch = NCH(tree);
-    int res = ((nch >= 6)
-	       && ((nch % 3) == 0)
-	       && validate_name(CHILD(tree, 0), "try")
+    int pos = 3;
+    int res = (validate_ntype(tree, try_stmt)
+	       && (nch >= 6) && ((nch % 3) == 0));
+
+    if (res)
+	res = (validate_name(CHILD(tree, 0), "try")
 	       && validate_colon(CHILD(tree, 1))
-	       && validate_ntype(CHILD(tree, 2), suite)
 	       && validate_suite(CHILD(tree, 2))
 	       && validate_colon(CHILD(tree, nch - 2))
-	       && validate_ntype(CHILD(tree, nch - 1), suite)
 	       && validate_suite(CHILD(tree, nch - 1)));
-
-    if (res && (TYPE(CHILD(tree, 3)) == except_clause)) {
-	int groups = (nch / 3) - 2;
-
-	res = validate_except_clause(CHILD(tree, 3));
-
-	if (res && (groups != 0)) {
-	    int cln_pos = 4;
-	    int sui_pos = 5;
-	    int nxt_pos = 6;
-
-	    while (res && groups--) {
-		res = (validate_colon(CHILD(tree, cln_pos))
-		       && validate_ntype(CHILD(tree, sui_pos), suite)
-		       && validate_suite(CHILD(tree, sui_pos)));
-
-		if (res && (TYPE(CHILD(tree, nxt_pos)) == NAME)) {
-		    res = ((groups == 0)
-			   && validate_name(CHILD(tree, nxt_pos), "else"));
-		}
-		else if (res) {
-		    res = (validate_ntype(CHILD(tree, nxt_pos), except_clause)
-			   && validate_except_clause(CHILD(tree, nxt_pos)));
-		}
-		/* Update for next group. */
-		cln_pos += 3;
-		sui_pos += 3;
-		nxt_pos += 3;
-	    }
-	}
+    else {
+	const char* name = "execpt";
+	char buffer[60];
+	if (TYPE(CHILD(tree, nch - 3)) != except_clause)
+	    name = STR(CHILD(tree, nch - 3));
+	sprintf(buffer, "Illegal number of children for try/%s node.", name);
+	err_string(buffer);
     }
-    else if (res) {
-	res = ((nch == 6)
-	       && validate_name(CHILD(tree, 3), "finally"));
+    /*	Skip past except_clause sections:  */
+    while (res && (TYPE(CHILD(tree, pos)) == except_clause)) {
+	res = (validate_except_clause(CHILD(tree, pos))
+	       && validate_colon(CHILD(tree, pos + 1))
+	       && validate_suite(CHILD(tree, pos + 2)));
+	pos += 3;
+    }
+    if (res && (pos < nch)) {
+	res = validate_ntype(CHILD(tree, pos), NAME);
+	if (res && (strcmp(STR(CHILD(tree, pos)), "finally") == 0))
+	    res = (validate_numnodes(tree, 6, "try/finally")
+		   && validate_colon(CHILD(tree, 4))
+		   && validate_suite(CHILD(tree, 5)));
+	else if (res)
+	    if (nch == (pos + 3)) {
+		res = ((strcmp(STR(CHILD(tree, pos)), "except") == 0)
+		       || (strcmp(STR(CHILD(tree, pos)), "else") == 0));
+		if (!res)
+		    err_string("Illegal trailing triple in try statement.");
+	    }
+	    else if (nch == (pos + 6))
+		res = (validate_name(CHILD(tree, pos), "except")
+		       && validate_colon(CHILD(tree, pos + 1))
+		       && validate_suite(CHILD(tree, pos + 2))
+		       && validate_name(CHILD(tree, pos + 3), "else"));
+	    else
+		res = validate_numnodes(tree, pos + 3, "try/except");
     }
     return (res);
 
 }   /* validate_try() */
 
 
-VALIDATE(except_clause) {
+validate_except_clause(tree)
+    node *tree;
+{
     int nch = NCH(tree);
-    int res = (((nch == 1) || (nch == 2) || (nch == 4))
+    int res = (validate_ntype(tree, except_clause)
+	       && ((nch == 1) || (nch == 2) || (nch == 4))
 	       && validate_name(CHILD(tree, 0), "except"));
 
-    if (res && (nch > 1)) {
-	res = (validate_ntype(CHILD(tree, 1), test)
-	       && validate_test(CHILD(tree, 1)));
-    }
-    if (res && (nch == 4)) {
+    if (res && (nch > 1))
+	res = validate_test(CHILD(tree, 1));
+    if (res && (nch == 4))
 	res = (validate_comma(CHILD(tree, 2))
-	       && validate_ntype(CHILD(tree, 3), test)
 	       && validate_test(CHILD(tree, 3)));
-    }
+
     return (res);
 
 }   /* validate_except_clause() */
 
 
-VALIDATE(test) {
+validate_test(tree)
+    node *tree;
+{
     int nch = NCH(tree);
-    int res = is_odd(nch);
+    int res = validate_ntype(tree, test) && is_odd(nch);
 
-    if (res && (TYPE(CHILD(tree, 0)) == lambdef)) {
+    if (res && (TYPE(CHILD(tree, 0)) == lambdef))
 	res = ((nch == 1)
 	       && validate_lambdef(CHILD(tree, 0)));
-    }
     else if (res) {
 	int pos;
-
-	res = (validate_ntype(CHILD(tree, 0), and_test)
-	       && validate_and_test(CHILD(tree, 0)));
-
-	for (pos = 1; res && (pos < nch); pos += 2) {
-	    res = (validate_comma(CHILD(tree, pos))
-		   && validate_ntype(CHILD(tree, pos + 1), and_test)
+	res = validate_and_test(CHILD(tree, 0));
+	for (pos = 1; res && (pos < nch); pos += 2)
+	    res = (validate_name(CHILD(tree, pos), "or")
 		   && validate_and_test(CHILD(tree, pos + 1)));
-	}
     }
     return (res);
 
 }   /* validate_test() */
 
 
-VALIDATE(and_test) {
+validate_and_test(tree)
+    node *tree;
+{
     int pos;
     int nch = NCH(tree);
-    int res = (is_odd(nch)
-	       && validate_ntype(CHILD(tree, 0), not_test)
+    int res = (validate_ntype(tree, and_test)
+	       && is_odd(nch)
 	       && validate_not_test(CHILD(tree, 0)));
 
-    for (pos = 1; res && (pos < nch); pos += 2) {
+    for (pos = 1; res && (pos < nch); pos += 2)
 	res = (validate_name(CHILD(tree, pos), "and")
-	       && validate_ntype(CHILD(tree, 0), not_test)
 	       && validate_not_test(CHILD(tree, 0)));
-    }
+
     return (res);
 
 }   /* validate_and_test() */
 
 
-VALIDATE(not_test) {
+validate_not_test(tree)
+    node *tree;
+{
     int nch = NCH(tree);
+    int res = validate_ntype(tree, not_test) && ((nch == 1) || (nch == 2));
 
-    return (((nch == 2)
-	     && validate_name(CHILD(tree, 0), "not")
-	     && validate_ntype(CHILD(tree, 1), not_test)
-	     && validate_not_test(CHILD(tree, 1)))
-	    || ((nch == 1)
-		&& validate_ntype(CHILD(tree, 0), comparison)
-		&& validate_comparison(CHILD(tree, 0))));
+    if (res) {
+	if (nch == 2)
+	    res = (validate_name(CHILD(tree, 0), "not")
+		   && validate_not_test(CHILD(tree, 1)));
+	else if (nch == 1)
+	    res = validate_comparison(CHILD(tree, 0));
+    }
+    return (res);
 
 }   /* validate_not_test() */
 
 
-VALIDATE(comparison) {
+validate_comparison(tree)
+    node *tree;
+{
     int pos;
     int nch = NCH(tree);
-    int res = (is_odd(nch)
-	       && validate_ntype(CHILD(tree, 0), expr)
+    int res = (validate_ntype(tree, comparison)
+	       && is_odd(nch)
 	       && validate_expr(CHILD(tree, 0)));
 
-    for (pos = 1; res && (pos < nch); pos += 2) {
-	res = (validate_ntype(CHILD(tree, pos), comp_op)
-	       && validate_comp_op(CHILD(tree, pos))
-	       && validate_ntype(CHILD(tree, pos + 1), expr)
-	       && validate_expr(CHILD(tree, 1)));
-    }
+    for (pos = 1; res && (pos < nch); pos += 2)
+	res = (validate_comp_op(CHILD(tree, pos))
+	       && validate_expr(CHILD(tree, pos + 1)));
+
     return (res);
 
 }   /* validate_comparison() */
 
 
-VALIDATE(comp_op) {
+validate_comp_op(tree)
+    node *tree;
+{
     int res = 0;
     int nch = NCH(tree);
 
+    if (!validate_ntype(tree, comp_op))
+	return (0);
     if (nch == 1) {
 	/*
 	 *  Only child will be a terminal with a well-defined symbolic name
@@ -1531,177 +1732,202 @@
 	      res = ((strcmp(STR(tree), "in") == 0)
 		     || (strcmp(STR(tree), "is") == 0));
 	      if (!res) {
-		  char buffer[128];
-
-		  sprintf(buffer, "Illegal comparison operator: '%s'.",
-			  STR(tree));
-		  PyErr_SetString(parser_error, buffer);
+		  char buff[128];
+		  sprintf(buff, "Illegal operator: '%s'.", STR(tree));
+		  err_string(buff);
 	      }
 	      break;
 	  default:
-	      PyErr_SetString(parser_error,
-			      "Illegal comparison operator type.");
+	      err_string("Illegal comparison operator type.");
 	      break;
 	}
     }
-    else if (nch == 2) {
+    else if (res = validate_numnodes(tree, 2, "comp_op")) {
 	res = (validate_ntype(CHILD(tree, 0), NAME)
 	       && validate_ntype(CHILD(tree, 1), NAME)
 	       && (((strcmp(STR(CHILD(tree, 0)), "is") == 0)
 		    && (strcmp(STR(CHILD(tree, 1)), "not") == 0))
 		   || ((strcmp(STR(CHILD(tree, 0)), "not") == 0)
 		       && (strcmp(STR(CHILD(tree, 1)), "in") == 0))));
-    }
-
-    if (!res && !PyErr_Occurred()) {
-	PyErr_SetString(parser_error, "Unknown comparison operator.");
+	if (!res && !PyErr_Occurred())
+	    err_string("Unknown comparison operator.");
     }
     return (res);
 
 }   /* validate_comp_op() */
 
 
-VALIDATE(expr) {
+validate_expr(tree)
+    node *tree;
+{
     int j;
     int nch = NCH(tree);
-    int res = (is_odd(nch)
-	       && validate_ntype(CHILD(tree, 0), xor_expr)
+    int res = (validate_ntype(tree, expr)
+	       && is_odd(nch)
 	       && validate_xor_expr(CHILD(tree, 0)));
 
-    for (j = 2; res && (j < nch); j += 2) {
-	res = (validate_ntype(CHILD(tree, j), xor_expr)
-	       && validate_xor_expr(CHILD(tree, j))
+    for (j = 2; res && (j < nch); j += 2)
+	res = (validate_xor_expr(CHILD(tree, j))
 	       && validate_vbar(CHILD(tree, j - 1)));
-    }
+
     return (res);
 
 }   /* validate_expr() */
 
 
-VALIDATE(xor_expr) {
+validate_xor_expr(tree)
+    node *tree;
+{
     int j;
     int nch = NCH(tree);
-    int res = (is_odd(nch)
-	       && validate_ntype(CHILD(tree, 0), and_expr)
+    int res = (validate_ntype(tree, xor_expr)
+	       && is_odd(nch)
 	       && validate_and_expr(CHILD(tree, 0)));
 
-    for (j = 2; res && (j < nch); j += 2) {
+    for (j = 2; res && (j < nch); j += 2)
 	res = (validate_circumflex(CHILD(tree, j - 1))
-	       && validate_ntype(CHILD(tree, j), and_expr)
 	       && validate_and_expr(CHILD(tree, j)));
-    }
+
     return (res);
 
 }   /* validate_xor_expr() */
 
 
-VALIDATE(and_expr) {
+validate_and_expr(tree)
+    node *tree;
+{
     int pos;
     int nch = NCH(tree);
-    int res = (is_odd(nch)
-	       && validate_ntype(CHILD(tree, 0), shift_expr)
+    int res = (validate_ntype(tree, and_expr)
+	       && is_odd(nch)
 	       && validate_shift_expr(CHILD(tree, 0)));
 
-    for (pos = 1; res && (pos < nch); pos += 2) {
+    for (pos = 1; res && (pos < nch); pos += 2)
 	res = (validate_ampersand(CHILD(tree, pos))
-	       && validate_ntype(CHILD(tree, pos + 1), shift_expr)
 	       && validate_shift_expr(CHILD(tree, pos + 1)));
-    }
+
     return (res);
 
 }   /* validate_and_expr() */
 
 
 static int
-validate_chain_two_ops(tree, termtype, termvalid, op1, op2)
-     node*	tree;
-     int	termtype;
-     int (*termvalid)(node*);
-     int	op1, op2;
-{
-    int pos;
+validate_chain_two_ops(tree, termvalid, op1, op2)
+     node *tree;
+     int (*termvalid)();
+     int op1;
+     int op2;
+ {
+    int pos = 1;
     int nch = NCH(tree);
     int res = (is_odd(nch)
-	       && validate_ntype(CHILD(tree, 0), termtype)
 	       && (*termvalid)(CHILD(tree, 0)));
 
-    for (pos = 1; res && (pos < nch); pos += 2) {
-	res = (((TYPE(CHILD(tree, pos)) == op1)
-		|| validate_ntype(CHILD(tree, pos), op2))
-	       && validate_ntype(CHILD(tree, pos + 1), termtype)
-	       && (*termvalid)(CHILD(tree, pos + 1)));
+    for ( ; res && (pos < nch); pos += 2) {
+	if (TYPE(CHILD(tree, pos)) != op1)
+	    res = validate_ntype(CHILD(tree, pos), op2);
+	if (res)
+	    res = (*termvalid)(CHILD(tree, pos + 1));
     }
     return (res);
 
 }   /* validate_chain_two_ops() */
 
 
-VALIDATE(shift_expr) {
-
-    return (validate_chain_two_ops(tree, arith_expr,
-				   validate_arith_expr,
-				   LEFTSHIFT, RIGHTSHIFT));
+validate_shift_expr(tree)
+    node *tree;
+{
+    return (validate_ntype(tree, shift_expr)
+	    && validate_chain_two_ops(tree, validate_arith_expr,
+				      LEFTSHIFT, RIGHTSHIFT));
 
 }   /* validate_shift_expr() */
 
 
-VALIDATE(arith_expr) {
-
-    return (validate_chain_two_ops(tree, term,
-				   validate_term,
-				   PLUS, MINUS));
+validate_arith_expr(tree)
+    node *tree;
+{
+    return (validate_ntype(tree, arith_expr)
+	    && validate_chain_two_ops(tree, validate_term, PLUS, MINUS));
 
 }   /* validate_arith_expr() */
 
 
-VALIDATE(term) {
-    int pos;
+validate_term(tree)
+    node *tree;
+{
+    int pos = 1;
     int nch = NCH(tree);
-    int res = (is_odd(nch)
-	       && validate_ntype(CHILD(tree, 0), factor)
+    int res = (validate_ntype(tree, term)
+	       && is_odd(nch)
 	       && validate_factor(CHILD(tree, 0)));
 
-    for (pos = 1; res && (pos < nch); pos += 2) {
-	res= (((TYPE(CHILD(tree, pos)) == STAR)
+    for ( ; res && (pos < nch); pos += 2)
+	res = (((TYPE(CHILD(tree, pos)) == STAR)
 	       || (TYPE(CHILD(tree, pos)) == SLASH)
-	       || validate_ntype(CHILD(tree, pos), PERCENT))
-	      && validate_ntype(CHILD(tree, pos + 1), factor)
-	      && validate_factor(CHILD(tree, pos + 1)));
-    }
+	       || (TYPE(CHILD(tree, pos)) == PERCENT))
+	       && validate_factor(CHILD(tree, pos + 1)));
+
     return (res);
 
 }   /* validate_term() */
 
 
-VALIDATE(factor) {
+/*  factor:
+ *
+ *  factor: ('+'|'-'|'~') factor | power
+ */
+validate_factor(tree)
+    node *tree;
+{
     int nch = NCH(tree);
-    int res = (((nch == 2)
-		&& ((TYPE(CHILD(tree, 0)) == PLUS)
-		    || (TYPE(CHILD(tree, 0)) == MINUS)
-		    || validate_ntype(CHILD(tree, 0), TILDE))
-		&& validate_ntype(CHILD(tree, 1), factor)
-		&& validate_factor(CHILD(tree, 1)))
-	       || ((nch >= 1)
-		   && validate_ntype(CHILD(tree, 0), atom)
-		   && validate_atom(CHILD(tree, 0))));
-
-    if (res && (TYPE(CHILD(tree, 0)) == atom)) {
-	int pos;
-
-	for (pos = 1; res && (pos < nch); ++pos) {
-	    res = (validate_ntype(CHILD(tree, pos), trailer)
-		   && validate_trailer(CHILD(tree, pos)));
-	}
-    }
+    int res = (validate_ntype(tree, factor)
+	       && (((nch == 2)
+		    && ((TYPE(CHILD(tree, 0)) == PLUS)
+		        || (TYPE(CHILD(tree, 0)) == MINUS)
+		        || (TYPE(CHILD(tree, 0)) == TILDE))
+		    && validate_factor(CHILD(tree, 1)))
+		   || ((nch == 1)
+		       && validate_power(CHILD(tree, 0)))));
     return (res);
 
 }   /* validate_factor() */
 
 
-VALIDATE(atom) {
+/*  power:
+ *
+ *  power: atom trailer* ('**' factor)*
+ */
+validate_power(tree)
+    node *tree;
+{
+    int pos = 1;
+    int nch = NCH(tree);
+    int res = (validate_ntype(tree, power) && (nch >= 1)
+	       && validate_atom(CHILD(tree, 0)));
+
+    while (res && (pos < nch) && (TYPE(CHILD(tree, pos)) == trailer))
+	res = validate_trailer(CHILD(tree, pos++));
+    if (res && (pos < nch)) {
+	if (!is_even(nch - pos)) {
+	    err_string("Illegal number of nodes for 'power'.");
+	    return (0);
+	}
+	for ( ; res && (pos < (nch - 1)); pos += 2)
+	    res = (validate_doublestar(CHILD(tree, pos))
+		   && validate_factor(CHILD(tree, pos + 1)));
+    }
+    return (res);
+
+}   /* validate_power() */
+
+
+validate_atom(tree)
+    node *tree;
+{
     int pos;
     int nch = NCH(tree);
-    int res = (nch >= 1);
+    int res = validate_ntype(tree, atom) && (nch >= 1);
 
     if (res) {
 	switch (TYPE(CHILD(tree, 0))) {
@@ -1709,32 +1935,25 @@
 	    res = ((nch <= 3)
 		   && (validate_rparen(CHILD(tree, nch - 1))));
 
-	    if (res && (nch == 3)) {
-		res = (validate_ntype(CHILD(tree, 1), testlist)
-		       && validate_testlist(CHILD(tree, 1)));
-	    }
+	    if (res && (nch == 3))
+		res = validate_testlist(CHILD(tree, 1));
 	    break;
 	  case LSQB:
 	    res = ((nch <= 3)
 		   && validate_ntype(CHILD(tree, nch - 1), RSQB));
 
-	    if (res && (nch == 3)) {
-		res = (validate_ntype(CHILD(tree, 1), testlist)
-		       && validate_testlist(CHILD(tree, 1)));
-	    }
+	    if (res && (nch == 3))
+		res = validate_testlist(CHILD(tree, 1));
 	    break;
 	  case LBRACE:
 	    res = ((nch <= 3)
 		   && validate_ntype(CHILD(tree, nch - 1), RBRACE));
 
-	    if (res && (nch == 3)) {
-		res = (validate_ntype(CHILD(tree, 1), dictmaker)
-		       && validate_dictmaker(CHILD(tree, 1)));
-	    }
+	    if (res && (nch == 3))
+		res = validate_dictmaker(CHILD(tree, 1));
 	    break;
 	  case BACKQUOTE:
 	    res = ((nch == 3)
-		   && validate_ntype(CHILD(tree, 1), testlist)
 		   && validate_testlist(CHILD(tree, 1))
 		   && validate_ntype(CHILD(tree, 2), BACKQUOTE));
 	    break;
@@ -1743,9 +1962,8 @@
 	    res = (nch == 1);
 	    break;
 	  case STRING:
-	    for (pos = 1; res && (pos < nch); ++pos) {
+	    for (pos = 1; res && (pos < nch); ++pos)
 		res = validate_ntype(CHILD(tree, pos), STRING);
-	    }
 	    break;
 	  default:
 	    res = 0;
@@ -1757,58 +1975,119 @@
 }   /* validate_atom() */
 
 
-VALIDATE(funcdef) {
-
-    return ((NCH(tree) == 5)
+/*  funcdef:
+ *	'def' NAME parameters ':' suite
+ *
+ */
+validate_funcdef(tree)
+    node *tree;
+{
+    return (validate_ntype(tree, funcdef)
+	    && validate_numnodes(tree, 5, "funcdef")
 	    && validate_name(CHILD(tree, 0), "def")
 	    && validate_ntype(CHILD(tree, 1), NAME)
-	    && validate_ntype(CHILD(tree, 2), parameters)
 	    && validate_colon(CHILD(tree, 3))
-	    && validate_ntype(CHILD(tree, 4), suite)
 	    && validate_parameters(CHILD(tree, 2))
 	    && validate_suite(CHILD(tree, 4)));
 
 }   /* validate_funcdef() */
 
 
-VALIDATE(lambdef) {
+validate_lambdef(tree)
+    node *tree;
+{
     int nch = NCH(tree);
-    int res = (((nch == 3) || (nch == 4))
+    int res = (validate_ntype(tree, lambdef)
+	       && ((nch == 3) || (nch == 4))
 	       && validate_name(CHILD(tree, 0), "lambda")
 	       && validate_colon(CHILD(tree, nch - 2))
-	       && validate_ntype(CHILD(tree, nch - 1), test)
-	       && validate_testlist(CHILD(tree, nch - 1)));
+	       && validate_test(CHILD(tree, nch - 1)));
 
-    if (res && (nch == 4)) {
-	res = (validate_ntype(CHILD(tree, 1), varargslist)
-	       && validate_varargslist(CHILD(tree, 1)));
-    }
+    if (res && (nch == 4))
+	res = validate_varargslist(CHILD(tree, 1));
+    else if (!res && !PyErr_Occurred())
+	validate_numnodes(tree, 3, "lambdef");
+
     return (res);
 
 }   /* validate_lambdef() */
 
 
-VALIDATE(trailer) {
+/*  arglist:
+ *
+ *  argument (',' argument)* [',']
+ */
+validate_arglist(tree)
+    node *tree;
+{
     int nch = NCH(tree);
-    int res = ((nch == 2) || (nch == 3));
+    int res = (validate_ntype(tree, arglist)
+	       && (nch > 0)
+	       && validate_argument(CHILD(tree, 0)));
+
+    if (res && is_even(nch))
+	res = validate_comma(CHILD(tree, nch - 1));
+    if (!res && !PyErr_Occurred())
+	validate_numnodes(tree, 1, "arglist");
+    --nch;
+    if (res && (nch > 1)) {
+	int j = 1;
+	for ( ; res && (j < (nch - 2)); j += 2)
+	    res = (validate_comma(CHILD(tree, j))
+		   && validate_argument(CHILD(tree, j + 1)));
+    }
+    return (res);
+
+}   /* validate_arglist() */
+
+
+
+/*  argument:
+ *
+ *  [test '='] test
+ */
+validate_argument(tree)
+    node *tree;
+{
+    int nch = NCH(tree);
+    int res = (validate_ntype(tree, argument)
+	       && ((nch == 1) || (nch == 3))
+	       && validate_test(CHILD(tree, 0)));
+
+    if (res && (nch == 3))
+	res = (validate_equal(CHILD(tree, 1))
+	       && validate_test(CHILD(tree, 2)));
+
+    return (res);
+
+}   /* validate_argument() */
+
+
+
+/*  trailer:
+ *
+ *  '(' [arglist] ')' | '[' subscript ']' | '.' NAME
+ */
+validate_trailer(tree)
+    node *tree;
+{
+    int nch = NCH(tree);
+    int res = validate_ntype(tree, trailer) && ((nch == 2) || (nch == 3));
 
     if (res) {
 	switch (TYPE(CHILD(tree, 0))) {
 	  case LPAR:
 	    res = validate_rparen(CHILD(tree, nch - 1));
-	    if (res && (nch == 3)) {
-		res = (validate_ntype(CHILD(tree, 1), testlist)
-		       && validate_testlist(CHILD(tree, 1)));
-	    }
+	    if (res && (nch == 3))
+		res = validate_arglist(CHILD(tree, 1));
 	    break;
 	  case LSQB:
-	    res = ((nch == 3)
-		   && validate_ntype(CHILD(tree, 1), subscript)
+	    res = (validate_numnodes(tree, 3, "trailer")
 		   && validate_subscript(CHILD(tree, 1))
 		   && validate_ntype(CHILD(tree, 2), RSQB));
 	    break;
 	  case DOT:
-	    res = ((nch == 2)
+	    res = (validate_numnodes(tree, 2, "trailer")
 		   && validate_ntype(CHILD(tree, 1), NAME));
 	    break;
 	  default:
@@ -1816,89 +2095,105 @@
 	    break;
 	}
     }
+    else
+	validate_numnodes(tree, 2, "trailer");
+
     return (res);
 
 }   /* validate_trailer() */
 
 
-VALIDATE(subscript) {
+/*  subscript:
+ *
+ *  test (',' test)* [','] | [test] ':' [test]
+ */
+validate_subscript(tree)
+    node *tree;
+{
     int nch = NCH(tree);
-    int res = ((nch >= 1) && (nch <= 3));
+    int res = validate_ntype(tree, subscript) && (nch >= 1);
 
+    if (res && is_even(nch) && (nch >= 4))
+	if (TYPE(CHILD(tree, nch - 1)) == COMMA)
+	    --nch;
+	else
+	    res = 0;
     if (res && is_odd(nch)) {
-	res = (validate_ntype(CHILD(tree, 0), test)
-	       && validate_test(CHILD(tree, 0)));
-
-	if (res && (nch == 3)) {
-	    res = (validate_colon(CHILD(tree, 1))
-		   && validate_ntype(CHILD(tree, 2), test)
-		   && validate_test(CHILD(tree, 2)));
+	if (TYPE(CHILD(tree, 0)) == COLON)
+	    res = validate_numnodes(tree, 1, "subscript");
+	else {
+	    res = validate_test(CHILD(tree, 0));
+	    if (res && (nch == 3))
+		res = ((TYPE(CHILD(tree, 1)) == COMMA)
+			|| validate_colon(CHILD(tree, 1)))
+		       && validate_test(CHILD(tree, 2));
+	    else if ((res && (nch >= 5))) {
+		int pos = 1;
+		while (res && (pos <= (nch - 2))) {
+		    res = (validate_comma(CHILD(tree, pos))
+			   && validate_test(CHILD(tree, pos + 1)));
+		    pos += 2;
+		}
+	    }
 	}
     }
-    else if (res == 2) {
-	if (TYPE(CHILD(tree, 0)) == COLON) {
-	    res = (validate_ntype(CHILD(tree, 1), test)
-		   && validate_test(CHILD(tree, 1)));
-	}
-	else {
-	    res = (validate_ntype(CHILD(tree, 0), test)
-		   && validate_test(CHILD(tree, 0))
-		   && validate_colon(CHILD(tree, 1)));
-	}
+    else if (nch == 2) {
+	if (TYPE(CHILD(tree, 0)) == COLON)
+	    res = validate_test(CHILD(tree, 1));
+	else if (TYPE(CHILD(tree, 1)) == COLON)
+	    res = validate_test(CHILD(tree, 0));
+	else
+	    res = (validate_test(CHILD(tree, 0))
+		   && validate_comma(CHILD(tree, 1)));
     }
     return (res);
 
 }   /* validate_subscript() */
 
 
-VALIDATE(exprlist) {
+validate_exprlist(tree)
+    node *tree;
+{
     int nch = NCH(tree);
-    int res = ((nch >= 1)
-	       && validate_ntype(CHILD(tree, 0), expr)
+    int res = (validate_ntype(tree, exprlist)
+	       && (nch >= 1)
 	       && validate_expr(CHILD(tree, 0)));
 
-    if (res && is_even(nch)) {
+    if (res && is_even(nch))
 	res = validate_comma(CHILD(tree, --nch));
-    }
     if (res && (nch > 1)) {
 	int pos;
-
-	for (pos = 1; res && (pos < nch); pos += 2) {
+	for (pos = 1; res && (pos < nch); pos += 2)
 	    res = (validate_comma(CHILD(tree, pos))
-		   && validate_ntype(CHILD(tree, pos + 1), expr)
 		   && validate_expr(CHILD(tree, pos + 1)));
-	}
     }
     return (res);
 
 }   /* validate_exprlist() */
 
 
-VALIDATE(dictmaker) {
+validate_dictmaker(tree)
+    node *tree;
+{
     int nch = NCH(tree);
-    int res = ((nch >= 3)
-	       && validate_ntype(CHILD(tree, 0), test)
+    int res = (validate_ntype(tree, dictmaker)
+	       && (nch >= 3)
 	       && validate_test(CHILD(tree, 0))
 	       && validate_colon(CHILD(tree, 1))
-	       && validate_ntype(CHILD(tree, 2), test)
 	       && validate_test(CHILD(tree, 2)));
 
-    if (res && ((nch % 4) == 0)) {
+    if (res && ((nch % 4) == 0))
 	res = validate_comma(CHILD(tree, --nch));
-    }
-    else if (res) {
+    else if (res)
 	res = ((nch % 4) == 3);
-    }
+
     if (res && (nch > 3)) {
 	int pos = 3;
-
-	/* What's left are groups of:  ',' test ':' test  */
+	/*  ( ',' test ':' test )*  */
 	while (res && (pos < nch)) {
 	    res = (validate_comma(CHILD(tree, pos))
-		   && validate_ntype(CHILD(tree, pos + 1), test)
 		   && validate_test(CHILD(tree, pos + 1))
 		   && validate_colon(CHILD(tree, pos + 2))
-		   && validate_ntype(CHILD(tree, pos + 3), test)
 		   && validate_test(CHILD(tree, pos + 3)));
 	    pos += 4;
 	}
@@ -1908,26 +2203,31 @@
 }   /* validate_dictmaker() */
 
 
-VALIDATE(eval_input) {
+validate_eval_input(tree)
+    node *tree;
+{
     int pos;
     int nch = NCH(tree);
-    int res = ((nch >= 2)
+    int res = (validate_ntype(tree, eval_input)
+	       && (nch >= 2)
 	       && validate_testlist(CHILD(tree, 0))
 	       && validate_ntype(CHILD(tree, nch - 1), ENDMARKER));
 
-    for (pos = 1; res && (pos < (nch - 1)); ++pos) {
+    for (pos = 1; res && (pos < (nch - 1)); ++pos)
 	res = validate_ntype(CHILD(tree, pos), NEWLINE);
-    }
+
     return (res);
 
 }   /* validate_eval_input() */
 
 
-VALIDATE(node) {
+validate_node(tree)
+    node *tree;
+{
     int   nch  = 0;			/* num. children on current node  */
     int   res  = 1;			/* result value			  */
     node* next = 0;			/* node to process after this one */
-    
+
     while (res & (tree != 0)) {
 	nch  = NCH(tree);
 	next = 0;
@@ -1943,30 +2243,28 @@
 	    break;
 	    /*
 	     *  "Trivial" parse tree nodes.
+	     *  (Why did I call these trivial?)
 	     */
 	  case stmt:
 	    res = validate_stmt(tree);
 	    break;
 	  case small_stmt:
-	    res = ((nch == 1)
-		   && ((TYPE(CHILD(tree, 0)) == expr_stmt)
-		       || (TYPE(CHILD(tree, 0)) == print_stmt)
-		       || (TYPE(CHILD(tree, 0)) == del_stmt)
-		       || (TYPE(CHILD(tree, 0)) == pass_stmt)
-		       || (TYPE(CHILD(tree, 0)) == flow_stmt)
-		       || (TYPE(CHILD(tree, 0)) == import_stmt)
-		       || (TYPE(CHILD(tree, 0)) == global_stmt)
-		       || (TYPE(CHILD(tree, 0)) == access_stmt)
-		       || validate_ntype(CHILD(tree, 0), exec_stmt))
-		   && (next = CHILD(tree, 0)));
+	    /*
+	     *  expr_stmt | print_stmt  | del_stmt | pass_stmt | flow_stmt
+	     *  | import_stmt | global_stmt | access_stmt | exec_stmt
+	     */
+	    res = validate_small_stmt(tree);
 	    break;
 	  case flow_stmt:
-	    res  = ((nch == 1)
+	    res  = (validate_numnodes(tree, 1, "flow_stmt")
 		    && ((TYPE(CHILD(tree, 0)) == break_stmt)
 			|| (TYPE(CHILD(tree, 0)) == continue_stmt)
 			|| (TYPE(CHILD(tree, 0)) == return_stmt)
-			|| validate_ntype(CHILD(tree, 0), raise_stmt))
-		    && (next = CHILD(tree, 0)));
+			|| (TYPE(CHILD(tree, 0)) == raise_stmt)));
+	    if (res)
+		next = CHILD(tree, 0);
+	    else if (nch == 1)
+		err_string("Illegal flow_stmt type.");
 	    break;
 	    /*
 	     *  Compound statements.
@@ -1975,14 +2273,7 @@
 	    res = validate_simple_stmt(tree);
 	    break;
 	  case compound_stmt:
-	    res = ((NCH(tree) == 1)
-		   && ((TYPE(CHILD(tree, 0)) == if_stmt)
-		       || (TYPE(CHILD(tree, 0)) == while_stmt)
-		       || (TYPE(CHILD(tree, 0)) == for_stmt)
-		       || (TYPE(CHILD(tree, 0)) == try_stmt)
-		       || (TYPE(CHILD(tree, 0)) == funcdef)
-		       || validate_ntype(CHILD(tree, 0), classdef))
-		   && (next = CHILD(tree, 0)));
+	    res = validate_compound_stmt(tree);
 	    break;
 	    /*
 	     *  Fundemental statements.
@@ -1997,15 +2288,15 @@
 	    res = validate_del_stmt(tree);
 	    break;
 	  case pass_stmt:
-	    res = ((nch == 1)
+	    res = (validate_numnodes(tree, 1, "pass")
 		   && validate_name(CHILD(tree, 0), "pass"));
 	    break;
 	  case break_stmt:
-	    res = ((nch == 1)
+	    res = (validate_numnodes(tree, 1, "break")
 		   && validate_name(CHILD(tree, 0), "break"));
 	    break;
 	  case continue_stmt:
-	    res = ((nch == 1)
+	    res = (validate_numnodes(tree, 1, "continue")
 		   && validate_name(CHILD(tree, 0), "continue"));
 	    break;
 	  case return_stmt:
@@ -2020,9 +2311,11 @@
 	  case global_stmt:
 	    res = validate_global_stmt(tree);
 	    break;
+#if defined(access_stmt) && defined(accesstype)
 	  case access_stmt:
 	    res = validate_access_stmt(tree);
 	    break;
+#endif
 	  case exec_stmt:
 	    res = validate_exec_stmt(tree);
 	    break;
@@ -2062,6 +2355,9 @@
 	  case exprlist:
 	    res = validate_exprlist(tree);
 	    break;
+	  case comp_op:
+	    res = validate_comp_op(tree);
+	    break;
 	  case expr:
 	    res = validate_expr(tree);
 	    break;
@@ -2083,12 +2379,16 @@
 	  case factor:
 	    res = validate_factor(tree);
 	    break;
+	  case power:
+	    res = validate_power(tree);
+	    break;
 	  case atom:
 	    res = validate_atom(tree);
 	    break;
-	    
+
 	  default:
 	    /* Hopefully never reached! */
+	    err_string("Unrecogniged node type.");
 	    res = 0;
 	    break;
 	}
@@ -2099,53 +2399,77 @@
 }   /* validate_node() */
 
 
-VALIDATE(expr_tree) {
-    return (validate_ntype(tree, eval_input)
-	    && validate_eval_input(tree));
+validate_expr_tree(tree)
+    node *tree;
+{
+    int res = validate_eval_input(tree);
+
+    if (!res && !PyErr_Occurred())
+	err_string("Could not validate expression tuple.");
+
+    return (res);
 
 }   /* validate_expr_tree() */
 
 
-VALIDATE(suite_tree) {
-    int j;
-    int nch = NCH(tree);
-    int res = ((nch >= 1)
-	       && validate_ntype(CHILD(tree, nch - 1), ENDMARKER)
-	       && nch--);
+/*  file_input:
+ *	(NEWLINE | stmt)* ENDMARKER
+ */
+validate_file_input(tree)
+    node *tree;
+{
+    int j   = 0;
+    int nch = NCH(tree) - 1;
+    int res = ((nch >= 0)
+	       && validate_ntype(CHILD(tree, nch), ENDMARKER));
 
-    for (j = 0; res && (j < nch); ++j) {
-	res = ((TYPE(CHILD(tree, j)) == NEWLINE)
-	       || (validate_ntype(CHILD(tree, j), stmt)
-		   && validate_stmt(CHILD(tree, j))));
+    for ( ; res && (j < nch); ++j) {
+	if (TYPE(CHILD(tree, j)) == stmt)
+	    res = validate_stmt(CHILD(tree, j));
+	else
+	    res = validate_newline(CHILD(tree, j));
     }
+    /*	This stays in to prevent any internal failues from getting to the
+     *	user.  Hopefully, this won't be needed.  If a user reports getting
+     *	this, we have some debugging to do.
+     */
+    if (!res && !PyErr_Occurred())
+	err_string("VALIDATION FAILURE: report this to the maintainer!.");
+
     return (res);
 
 }   /* validate_suite_tree() */
 
 
-
 /*  Functions exported by this module.  Most of this should probably
  *  be converted into an AST object with methods, but that is better
  *  done directly in Python, allowing subclasses to be created directly.
- *  We'd really have to write a wrapper around it all anyway.
- *
+ *  We'd really have to write a wrapper around it all anyway to allow
+ *  inheritance.
  */
 static PyMethodDef parser_functions[] =  {
-    {"ast2tuple",	parser_ast2tuple,	1},
-    {"compileast",	parser_compileast,	1},
-    {"expr",		parser_expr,		1},
-    {"isexpr",		parser_isexpr,		1},
-    {"issuite",		parser_issuite,		1},
-    {"suite",		parser_suite,		1},
-    {"tuple2ast",	parser_tuple2ast,	1},
+    {"ast2tuple",	parser_ast2tuple,	1,
+	"Creates a tuple-tree representation of an AST."},
+    {"compileast",	parser_compileast,	1,
+	"Compiles an AST object into a code object."},
+    {"expr",		parser_expr,		1,
+	"Creates an AST object from an expression."},
+    {"isexpr",		parser_isexpr,		1,
+	"Determines if an AST object was created from an expression."},
+    {"issuite",		parser_issuite,		1,
+	"Determines if an AST object was created from a suite."},
+    {"suite",		parser_suite,		1,
+	"Creates an AST object from a suite."},
+    {"tuple2ast",	parser_tuple2ast,	1,
+	"Creates an AST object from a tuple-tree representation."},
 
     {0, 0, 0}
     };
 
 
-
 void
-initparser() {
+initparser()
+ {
     PyObject* module = Py_InitModule("parser", parser_functions);
     PyObject* dict   = PyModule_GetDict(module);
 
@@ -2156,11 +2480,14 @@
 	/*
 	 *  This is serious.
 	 */
-	Py_FatalError("can't define parser.error");
+	Py_FatalError("can't define parser.ParserError");
     }
     /*
      *  Nice to have, but don't cry if we fail.
      */
+    Py_INCREF(&PyAST_Type);
+    PyDict_SetItemString(dict, "ASTType", (PyObject*)&PyAST_Type);
+
     PyDict_SetItemString(dict, "__copyright__",
 			 PyString_FromString(parser_copyright_string));
     PyDict_SetItemString(dict, "__doc__",
@@ -2172,5 +2499,5 @@
 
 
 /*
- *  end of Parser.c
+ *  end of parsermodule.c
  */
