/*  parsermodule.c
 *
 *  Copyright 1995 by Fred L. Drake, Jr. and Virginia Polytechnic Institute
 *  and State University, Blacksburg, Virginia, USA.  Portions copyright
 *  1991-1995 by Stichting Mathematisch Centrum, Amsterdam, The Netherlands.
 *  Copying is permitted under the terms associated with the main Python
 *  distribution, with the additional restriction that this additional notice
 *  be included and maintained on all distributed copies.
 *
 *  This module serves to replace the original parser module written by
 *  Guido.  The functionality is not matched precisely, but the original
 *  may be implemented on top of this.  This is desirable since the source
 *  of the text to be parsed is now divorced from this interface.
 *
 *  Unlike the prior interface, the ability to give a parse tree produced
 *  by Python code as a tuple to the compiler is enabled by this module.
 *  See the documentation for more details.
 *
 */

#include "Python.h"			/* general Python API		  */
#include "graminit.h"			/* symbols defined in the grammar */
#include "node.h"			/* internal parser structure	  */
#include "token.h"			/* token definitions		  */
					/* ISTERMINAL() / ISNONTERMINAL() */
#include "compile.h"			/* PyNode_Compile()		  */

/*
 *  All the "fudge" declarations are here:
 *
 *  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();



/*  String constants used to initialize module attributes.
 *
 */
static char*
parser_copyright_string
= "Copyright 1995 by Virginia Polytechnic Institute & State University and\n"
  "Fred L. Drake, Jr., Blacksburg, Virginia, USA.  Portions copyright\n"
  "1991-1995 by Stichting Mathematisch Centrum, Amsterdam, The Netherlands.";


static char*
parser_doc_string
= "This is an interface to Python's internal parser.";

static char*
parser_version_string = "0.3";		/* changed to match python version  */


/*  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
 *  Institute and State University.  Changes were made to comply with the
 *  new naming conventions.
 */

/***********************************************************
Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
The Netherlands.

                        All Rights Reserved

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
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.

STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

******************************************************************/

static PyObject*
node2tuple(n)
     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;
	}
	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.
 */



/*  There are two types of intermediate objects we're interested in:
 *  'eval' and 'exec' types.  These constants can be used in the ast_type
 *  field of the object type to identify which any given object represents.
 *  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.  Maybe not useful?
 *  Haven't decided yet.
 */

#define PyAST_EXPR	1
#define PyAST_SUITE	2
#define PyAST_FRAGMENT	3


/*  These are the internal objects and definitions required to implement the
 *  AST type.  Most of the internal names are more reminiscent of the 'old'
 *  naming style, but the code uses the new naming convention.
 */

static PyObject*
parser_error = 0;


typedef struct _PyAST_Object {

    PyObject_HEAD			/* standard object header	    */
    node* ast_node;			/* the node* returned by the parser */
    int	  ast_type;			/* EXPR or SUITE ?		    */

} PyAST_Object;


staticforward void parser_free();
staticforward int  parser_compare();


/* static */
PyTypeObject PyAST_Type = {

    PyObject_HEAD_INIT(&PyType_Type)
    0,
    "ast",				/* tp_name		*/
    sizeof(PyAST_Object),		/* tp_basicsize		*/
    0,					/* tp_itemsize		*/
    (destructor)parser_free,		/* tp_dealloc		*/
    0,					/* tp_print		*/
    0,					/* tp_getattr		*/
    0,					/* tp_setattr		*/
    (cmpfunc)parser_compare,		/* tp_compare		*/
    0,					/* tp_repr		*/
    0,					/* tp_as_number		*/
    0,					/* tp_as_sequence	*/
    0,					/* tp_as_mapping	*/
    0,					/* tp_hash		*/
    0,					/* tp_call		*/
    0					/* tp_str		*/

};  /* PyAST_Type */


static int
parser_compare_nodes(left, right)
     node *left;
     node *right;
 {
    int j;

    if (TYPE(left) < TYPE(right))
	return (-1);

    if (TYPE(right) < TYPE(left))
	return (1);

    if (ISTERMINAL(TYPE(left)))
	return (strcmp(STR(left), STR(right)));

    if (NCH(left) < NCH(right))
	return (-1);

    if (NCH(right) < NCH(left))
	return (1);

    for (j = 0; j < NCH(left); ++j) {
	int v = parser_compare_nodes(CHILD(left, j), CHILD(right, j));

	if (v)
	    return (v);
    }
    return (0);

}   /* parser_compare_nodes() */


/*  int parser_compare(PyAST_Object* left, PyAST_Object* right)
 *
 *  Comparison function used by the Python operators ==, !=, <, >, <=, >=
 *  This really just wraps a call to parser_compare_nodes() with some easy
 *  checks and protection code.
 *
 */
static int
parser_compare(left, right)
     PyAST_Object *left;
     PyAST_Object *right;
 {

    if (left == right)
	return (0);

    if ((left == 0) || (right == 0))
	return (-1);

    return (parser_compare_nodes(left->ast_node, right->ast_node));

}   /* parser_compare() */


/*  parser_newastobject(node* ast)
 *
 *  Allocates a new Python object representing an AST.  This is simply the
 *  'wrapper' object that holds a node* and allows it to be passed around in
 *  Python code.
 *
 */
static PyObject*
parser_newastobject(ast, type)
     node *ast;
     int type;
 {

    PyAST_Object* o = PyObject_NEW(PyAST_Object, &PyAST_Type);

    if (o != 0) {
	o->ast_node = ast;
	o->ast_type = type;
    }
    return ((PyObject*)o);

}   /* parser_newastobject() */


/*  void parser_free(PyAST_Object* ast)
 *
 *  This is called by a del statement that reduces the reference count to 0.
 *
 */
static void
parser_free(ast)
     PyAST_Object *ast;
 {

    PyNode_Free(ast->ast_node);
    PyMem_DEL(ast);

}   /* parser_free() */


/*  parser_ast2tuple(PyObject* self, PyObject* args)
 *
 *  This provides conversion from a node* to a tuple object that can be
 *  returned to the Python-level caller.  The AST object is not modified.
 *
 */
static PyObject*
parser_ast2tuple(self, args)
     PyObject *self;
     PyObject *args;
 {

    PyObject* ast;
    PyObject* res = 0;

    if (PyArg_ParseTuple(args, "O!:ast2tuple", &PyAST_Type, &ast)) {
	/*
	 *  Convert AST into a tuple representation.  Use Guido's function,
	 *  since it's known to work already.
	 */
	res = node2tuple(((PyAST_Object*)ast)->ast_node);
    }
    return (res);

}   /* parser_ast2tuple() */


/*  parser_compileast(PyObject* self, PyObject* args)
 *
 *  This function creates code objects from the parse tree represented by
 *  the passed-in data object.  An optional file name is passed in as well.
 *
 */
static PyObject*
parser_compileast(self, 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 = (PyObject*) PyNode_Compile(ast->ast_node, str);

    return (res);

}   /* parser_compileast() */


/*  PyObject* parser_isexpr(PyObject* self, PyObject* args)
 *  PyObject* parser_issuite(PyObject* self, PyObject* args)
 *
 *  Checks the passed-in AST object to determine if it is an expression or
 *  a statement suite, respectively.  The return is a Python truth value.
 *
 */
static PyObject*
parser_isexpr(self, args)
     PyObject *self;
     PyObject *args;
 {
    PyAST_Object* ast;
    PyObject* res = 0;

    if (PyArg_ParseTuple(args, "O!:isexpr", &PyAST_Type, &ast)) {
	/*
	 *  Check to see if the AST represents an expression or not.
	 */
	res = (ast->ast_type == PyAST_EXPR) ? Py_True : Py_False;
	Py_INCREF(res);
    }
    return (res);

}   /* parser_isexpr() */


static PyObject*
parser_issuite(self, args)
     PyObject *self;
     PyObject *args;
 {

    PyAST_Object* ast;
    PyObject* res = 0;

    if (PyArg_ParseTuple(args, "O!:issuite", &PyAST_Type, &ast)) {
	/*
	 *  Check to see if the AST represents an expression or not.
	 */
	res = (ast->ast_type == PyAST_EXPR) ? Py_False : Py_True;
	Py_INCREF(res);
    }
    return (res);

}   /* 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
 *  successful, or set an exception if not.
 *
 */
static PyObject*
parser_do_parse(args, type)
     PyObject *args;
     int type;
 {

    char*     string = 0;
    PyObject* res    = 0;

    if (PyArg_ParseTuple(args, "s", &string)) {
	node* n = PyParser_SimpleParseString(string,
					     (type == PyAST_EXPR)
					     ? eval_input : file_input);

	if (n != 0)
	    res = parser_newastobject(n, type);
	else
	    err_string("Could not parse string.");
    }
    return (res);

}  /* parser_do_parse() */


/*  PyObject* parser_expr(PyObject* self, PyObject* args)
 *  PyObject* parser_suite(PyObject* self, PyObject* args)
 *
 *  External interfaces to the parser itself.  Which is called determines if
 *  the parser attempts to recognize an expression ('eval' form) or statement
 *  suite ('exec' form).  The real work is done by parser_do_parse() above.
 *
 */
static PyObject*
parser_expr(self, args)
     PyObject *self;
     PyObject *args;
 {

    return (parser_do_parse(args, PyAST_EXPR));

}   /* parser_expr() */


static PyObject*
parser_suite(self, args)
     PyObject *self;
     PyObject *args;
 {

    return (parser_do_parse(args, PyAST_SUITE));

}   /* parser_suite() */



/*  This is the messy part of the code.  Conversion from a tuple to an AST
 *  object requires that the input tuple be valid without having to rely on
 *  catching an exception from the compiler.  This is done to allow the
 *  compiler itself to remain fast, since most of its input will come from
 *  the parser directly, and therefore be known to be syntactically correct.
 *  This validation is done to ensure that we don't core dump the compile
 *  phase, returning an exception instead.
 *
 *  Two aspects can be broken out in this code:  creating a node tree from
 *  the tuple passed in, and verifying that it is indeed valid.  It may be
 *  advantageous to expand the number of AST types to include funcdefs and
 *  lambdadefs to take advantage of the optimizer, recognizing those ASTs
 *  here.  They are not necessary, and not quite as useful in a raw form.
 *  For now, let's get expressions and suites working reliably.
 */


staticforward node* build_node_tree();
staticforward int   validate_expr_tree();
staticforward int   validate_file_input();


/*  PyObject* parser_tuple2ast(PyObject* self, PyObject* args)
 *
 *  This is the public function, called from the Python code.  It receives a
 *  single tuple object from the caller, and creates an AST object if the
 *  tuple can be validated.  It does this by checking the first code of the
 *  tuple, and, if acceptable, builds the internal representation.  If this
 *  step succeeds, the internal representation is validated as fully as
 *  possible with the various validate_*() routines defined below.
 *
 *  This function must be changed if support is to be added for PyAST_FRAGMENT
 *  AST objects.
 *
 */
static PyObject*
parser_tuple2ast(self, args)
     PyObject *self;
     PyObject *args;
 {

    PyObject* ast	= 0;
    PyObject* tuple	= 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.
	 */

	int start_sym = PyInt_AsLong(PySequence_GetItem(tuple, 0));

	if (start_sym == eval_input) {
	    /*
	     *  Might be an eval form.
	     */
	    node* expression = build_node_tree(PySequence_GetItem(args, 0));

	    if ((expression != 0) && validate_expr_tree(expression))
		ast = parser_newastobject(expression, PyAST_EXPR);
	}
	else if (start_sym == file_input) {
	    /*
	     *  This looks like an exec form so far.
	     */
	    node* suite_tree = build_node_tree(PySequence_GetItem(args, 0));

	    if ((suite_tree != 0) && validate_file_input(suite_tree))
		ast = parser_newastobject(suite_tree, PyAST_SUITE);
	}
	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())
	    err_string("Unspecified ast error occurred.");
    }
    else
	PyErr_SetString(PyExc_TypeError,
			"parser.tuple2ast(): expected single tuple.");

    return (ast);

}   /* parser_tuple2ast() */


/*  int check_terminal_tuple()
 *
 *  Check a tuple to determine that it is indeed a valid terminal node.  The
 *  node is known to be required as a terminal, so we throw an exception if
 *  there is a failure.  The portion of the resulting node tree already built
 *  is passed in so we can deallocate it in the event of a failure.
 *
 *  The format of an acceptable terminal tuple is "(is)":  the fact that elem
 *  is a tuple and the integer is a valid terminal symbol has been established
 *  before this function is called.  We must check the length of the tuple and
 *  the type of the second element.  We do *NOT* check the actual text of the
 *  string element, which we could do in many cases.  This is done by the
 *  validate_*() functions which operate on the internal representation.
 *
 */
static int
check_terminal_tuple(elem, result)
     PyObject *elem;
     node *result;
 {

    int   res = 0;
    char* str = 0;

    if (PyObject_Length(elem) != 2)
	str = "Illegal terminal symbol; node too long.";
    else if (!PyString_Check(PySequence_GetItem(elem, 1)))
	str = "Illegal terminal symbol; expected a string.";
    else
	res = 1;

    if ((res == 0) && (result != 0)) {
	elem = Py_BuildValue("(os)", elem, str);
	PyErr_SetObject(parser_error, elem);
    }
    return (res);

}   /* check_terminal_tuple() */


/*  node* build_node_children()
 *
 *  Iterate across the children of the current non-terminal node and build
 *  their structures.  If successful, return the root of this portion of
 *  the tree, otherwise, 0.  Any required exception will be specified already,
 *  and no memory will have been deallocated.
 *
 */
static node*
build_node_children(tuple, root, line_num)
     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 = PySequence_GetItem(tuple, i);
	long      type = 0;
	char*     strn = 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(PySequence_GetItem(elem, 0));

	if (ISTERMINAL(type)) {
	    if (check_terminal_tuple(elem, root))
		strn = strdup(PyString_AsString(PySequence_GetItem(elem, 1)));
	    else
		return (0);
	}
	else if (!ISNONTERMINAL(type)) {
	    /*
	     *  It has to be one or the other; this is an error.
	     *  Throw an exception.
	     */
	    PyErr_SetObject(parser_error,
			    Py_BuildValue("(os)", elem,
					  "Unknown node type."));
	    return (0);
	}
	PyNode_AddChild(root, type, strn, *line_num);

	if (ISNONTERMINAL(type)) {
	    node* new_child = CHILD(root, i - 1);

	    if (new_child != build_node_children(elem, new_child, line_num))
		return (0);
	}
	else if (type == NEWLINE)	/* It's true:  we increment the     */
	    ++(*line_num);		/* line number *after* the newline! */
    }
    return (root);

}   /* build_node_children() */


static node*
build_node_tree(tuple)
     PyObject *tuple;
 {

    node* res = 0;
    long  num = PyInt_AsLong(PySequence_GetItem(tuple, 0));

    if (ISTERMINAL(num)) {
	/*
	 *  The tuple is simple, but it doesn't start with a start symbol.
	 *  Throw an exception now and be done with it.
	 */
	tuple = Py_BuildValue("(os)", tuple,
		    "Illegal ast tuple; cannot start with terminal symbol.");
	PyErr_SetObject(parser_error, tuple);
    }
    else if (ISNONTERMINAL(num)) {
	/*
	 *  Not efficient, but that can be handled later.
	 */
	int line_num = 0;

	res = PyNode_New(num);
	if (res != build_node_children(tuple, res, &line_num)) {
	    PyNode_Free(res);
	    res = 0;
	}
    }
    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()


/*
 *  Validation for the code above:
 */
VALIDATER(expr_tree);
VALIDATER(suite_tree);


/*
 *  Validation routines used within the validation section:
 */
staticforward int validate_terminal();

#define	validate_ampersand(ch)	validate_terminal(ch,	   AMPER, "&")
#define	validate_circumflex(ch)	validate_terminal(ch, CIRCUMFLEX, "^")
#define validate_colon(ch)	validate_terminal(ch,	   COLON, ":")
#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, 0)
#define validate_lparen(ch)	validate_terminal(ch,	    LPAR, "(")
#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)

#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(power);
VALIDATER(print_stmt);		VALIDATER(del_stmt);
VALIDATER(return_stmt);
VALIDATER(raise_stmt);		VALIDATER(import_stmt);
VALIDATER(global_stmt);		VALIDATER(file_input);
VALIDATER(exec_stmt);		VALIDATER(compound_stmt);
VALIDATER(while);		VALIDATER(for);
VALIDATER(try);			VALIDATER(except_clause);
VALIDATER(test);		VALIDATER(and_test);
VALIDATER(not_test);		VALIDATER(comparison);
VALIDATER(comp_op);		VALIDATER(expr);
VALIDATER(xor_expr);		VALIDATER(and_expr);
VALIDATER(shift_expr);		VALIDATER(arith_expr);
VALIDATER(term);		VALIDATER(factor);
VALIDATER(atom);		VALIDATER(lambdef);
VALIDATER(trailer);		VALIDATER(subscript);
VALIDATER(exprlist);		VALIDATER(dictmaker);
VALIDATER(arglist);		VALIDATER(argument);


#define	is_even(n)	(((n) & 1) == 0)
#define	is_odd(n)	(((n) & 1) == 1)


static int
validate_ntype(n, 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));
	err_string(buffer);
    }
    return (res);

}   /* validate_ntype() */


static int
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);

}   /* 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)
 *
 *  classdef:
 *	'class' NAME ['(' testlist ')'] ':' suite
 */
validate_class(tree)
    node *tree;
{
    int nch = NCH(tree);
    int res = validate_ntype(tree, classdef) && ((nch == 4) || (nch == 7));

    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() */


/*  if_stmt:
 *	'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]
 */
validate_if(tree)
    node *tree;
{
    int nch = NCH(tree);
    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_suite(CHILD(tree, 3)));

    if (res && ((nch % 4) == 3)) {
	/*  ... '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)
	/* Will catch the case for nch < 4 */
	res = validate_numnodes(tree, 0, "if");
    else if (res && (nch > 4)) {
	/*  ... ('elif' test ':' suite)+ ...  */
	int j = 4;
	while ((j < nch) && res) {
	    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;
	}
    }
    return (res);

}   /* validate_if() */


/*  parameters:
 *	'(' [varargslist] ')'
 *
 */
validate_parameters(tree)
    node *tree;
{
    int nch = NCH(tree);
    int res = validate_ntype(tree, parameters) && ((nch == 2) || (nch == 3));

    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)
 *
 *  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 (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 && (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(tree)
    node *tree;
{
    int i;
    int nch = NCH(tree);
    int res = validate_ntype(tree, testlist) && (nch >= 1);

    /*	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_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_test(CHILD(tree, nch));
    }
    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)
 *
 *  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 = validate_ntype(tree, varargslist) && (nch != 0);

    if (res && (nch >= 2) && (TYPE(CHILD(tree, nch - 1)) == NAME)) {
	/*  (fpdef ['=' test] ',')*
	 *  ('*' NAME [',' '*' '*' NAME] | '*' '*' NAME)
	 */
	int pos = 0;
	int remaining = nch;

	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) {
	    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
	err_string("Improperly formed argument list.");

    return (res);

}   /* validate_varargslist() */


/*  VALIDATE(fpdef)
 *
 *  fpdef:
 *	NAME
 *    | '(' fplist ')'
 */
validate_fpdef(tree)
    node *tree;
{
    int nch = NCH(tree);
    int res = validate_ntype(tree, fpdef);

    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(tree)
    node *tree;
{
    int j;
    int nch = NCH(tree);
    int res = (validate_ntype(tree, fplist)
	       && (nch != 0) && validate_fpdef(CHILD(tree, 0)));

    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() */


/*  simple_stmt | compound_stmt
 *
 */
validate_stmt(tree)
    node *tree;
{
    int res = (validate_ntype(tree, stmt)
	       && validate_numnodes(tree, 1, "stmt"));

    if (res) {
	tree = CHILD(tree, 0);

	if (TYPE(tree) == simple_stmt)
	    res = validate_simple_stmt(tree);
	else
	    res = validate_compound_stmt(tree);
    }
    return (res);

}   /* validate_stmt() */


/*  small_stmt (';' small_stmt)* [';'] NEWLINE
 *
 */
validate_simple_stmt(tree)
    node *tree;
{
    int nch = NCH(tree);
    int res = (validate_ntype(tree, simple_stmt)
	       && (nch >= 2)
	       && validate_small_stmt(CHILD(tree, 0))
	       && validate_newline(CHILD(tree, nch - 1)));

    if (nch < 2)
	res = validate_numnodes(tree, 2, "simple_stmt");
    --nch;				/* forget the NEWLINE	 */
    if (res && is_even(nch))
	res = validate_semi(CHILD(tree, --nch));
    if (res && (nch > 2)) {
	int i;

	for (i = 1; res && (i < nch); i += 2)
	    res = (validate_semi(CHILD(tree, i))
		   && validate_small_stmt(CHILD(tree, i + 1)));
    }
    return (res);

}   /* validate_simple_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 = (validate_ntype(tree, expr_stmt)
	       && is_odd(nch)
	       && validate_testlist(CHILD(tree, 0)));

    for (j = 1; res && (j < nch); j += 2)
	res = (validate_equal(CHILD(tree, j))
	       && validate_testlist(CHILD(tree, j + 1)));

    return (res);

}   /* validate_expr_stmt() */


/*  print_stmt:
 *
 *	'print' (test ',')* [test]
 *
 */
validate_print_stmt(tree)
    node *tree;
{
    int j;
    int nch = NCH(tree);
    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(tree)
    node *tree;
{
    return (validate_numnodes(tree, 2, "del_stmt")
	    && validate_name(CHILD(tree, 0), "del")
	    && validate_exprlist(CHILD(tree, 1)));

}   /* validate_del_stmt() */


validate_return_stmt(tree)
    node *tree;
{
    int nch = NCH(tree);
    int res = (validate_ntype(tree, return_stmt)
	       && ((nch == 1) || (nch == 2))
	       && validate_name(CHILD(tree, 0), "return"));

    if (res && (nch == 2))
	res = validate_testlist(CHILD(tree, 1));

    return (res);

}   /* validate_return_stmt() */


validate_raise_stmt(tree)
    node *tree;
{
    int nch = NCH(tree);
    int res = (validate_ntype(tree, raise_stmt)
	       && ((nch == 2) || (nch == 4) || (nch == 6)));

    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() */


/*  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 = (validate_ntype(tree, import_stmt)
	       && (nch >= 2) && is_even(nch)
	       && validate_ntype(CHILD(tree, 0), NAME)
	       && validate_ntype(CHILD(tree, 1), dotted_name));

    if (res && (strcmp(STR(CHILD(tree, 0)), "import") == 0)) {
	int j;

	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)
	       && validate_name(CHILD(tree, 2), "import"));
	if (nch == 4) {
	    res = ((TYPE(CHILD(tree, 3)) == NAME)
		   || (TYPE(CHILD(tree, 3)) == STAR));
	    if (!res)
		err_string("Illegal import statement.");
	}
	else {
	    /*  'from' NAME 'import' NAME (',' NAME)+  */
	    int j;
	    res = validate_ntype(CHILD(tree, 3), NAME);
	    for (j = 4; res && (j < nch); j += 2)
		res = (validate_comma(CHILD(tree, j))
		       && validate_ntype(CHILD(tree, j + 1), NAME));
	}
    }
    else
	res = 0;

    return (res);

}   /* validate_import_stmt() */


validate_global_stmt(tree)
    node *tree;
{
    int j;
    int nch = NCH(tree);
    int res = (validate_ntype(tree, global_stmt)
	       && is_even(nch) && (nch >= 2));

    if (res)
	res = (validate_name(CHILD(tree, 0), "global")
	       && validate_ntype(CHILD(tree, 1), NAME));
    for (j = 2; res && (j < nch); j += 2)
	res = (validate_comma(CHILD(tree, j))
	       && validate_ntype(CHILD(tree, j + 1), NAME));

    return (res);

}   /* validate_global_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 = (validate_ntype(tree, access_stmt)
	       && (nch >= 4) && is_even(nch)
	       && validate_name(CHILD(tree, 0), "access")
	       && validate_accesstype(CHILD(tree, nch - 1)));

    if (res && (TYPE(CHILD(tree, 1)) != STAR)) {
	int j;

	res = validate_ntype(CHILD(tree, 1), NAME);
	for (j = 2; res && (j < (nch - 2)); j += 2) {
	    if (TYPE(CHILD(tree, j)) == COLON)
		break;
	    res = (validate_comma(CHILD(tree, j))
		   && validate_ntype(CHILD(tree, j + 1), NAME)
		   && (pos += 2));
	}
    }
    else
	res = validate_star(CHILD(tree, 1));

    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(tree)
    node *tree;
{
    int nch = NCH(tree);
    int res = validate_ntype(tree, accesstype) && (nch >= 1);
    int i;

    for (i = 0; res && (i < nch); ++i)
	res = validate_ntype(CHILD(tree, i), NAME);

    return (res);

}   /* validate_accesstype() */
#endif


/*  exec_stmt:
 *
 *  'exec' expr ['in' test [',' test]]
 */
validate_exec_stmt(tree)
    node *tree;
{
    int nch = NCH(tree);
    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 && !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 == 6))
	res = (validate_comma(CHILD(tree, 4))
	       && validate_test(CHILD(tree, 5)));

    return (res);

}   /* validate_exec_stmt() */


validate_while(tree)
    node *tree;
{
    int nch = NCH(tree);
    int res = (validate_ntype(tree, while_stmt)
	       && ((nch == 4) || (nch == 7))
	       && validate_name(CHILD(tree, 0), "while")
	       && validate_test(CHILD(tree, 1))
	       && validate_colon(CHILD(tree, 2))
	       && validate_suite(CHILD(tree, 3)));

    if (res && (nch == 7))
	res = (validate_name(CHILD(tree, 4), "else")
	       && validate_colon(CHILD(tree, 5))
	       && validate_suite(CHILD(tree, 6)));

    return (res);

}   /* validate_while() */


validate_for(tree)
    node *tree;
{
    int nch = NCH(tree);
    int res = (validate_ntype(tree, for_stmt)
	       && ((nch == 6) || (nch == 9))
	       && validate_name(CHILD(tree, 0), "for")
	       && validate_exprlist(CHILD(tree, 1))
	       && validate_name(CHILD(tree, 2), "in")
	       && validate_testlist(CHILD(tree, 3))
	       && validate_colon(CHILD(tree, 4))
	       && validate_suite(CHILD(tree, 5)));

    if (res && (nch == 9))
	res = (validate_name(CHILD(tree, 6), "else")
	       && validate_colon(CHILD(tree, 7))
	       && validate_suite(CHILD(tree, 8)));

    return (res);

}   /* validate_for() */


/*  try_stmt:
 *	'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]
 *    | 'try' ':' suite 'finally' ':' suite
 *
 */
validate_try(tree)
    node *tree;
{
    int nch = NCH(tree);
    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_suite(CHILD(tree, 2))
	       && validate_colon(CHILD(tree, nch - 2))
	       && validate_suite(CHILD(tree, nch - 1)));
    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);
    }
    /*	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(tree)
    node *tree;
{
    int nch = NCH(tree);
    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_test(CHILD(tree, 1));
    if (res && (nch == 4))
	res = (validate_comma(CHILD(tree, 2))
	       && validate_test(CHILD(tree, 3)));

    return (res);

}   /* validate_except_clause() */


validate_test(tree)
    node *tree;
{
    int nch = NCH(tree);
    int res = validate_ntype(tree, test) && is_odd(nch);

    if (res && (TYPE(CHILD(tree, 0)) == lambdef))
	res = ((nch == 1)
	       && validate_lambdef(CHILD(tree, 0)));
    else if (res) {
	int pos;
	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(tree)
    node *tree;
{
    int pos;
    int nch = NCH(tree);
    int res = (validate_ntype(tree, and_test)
	       && is_odd(nch)
	       && validate_not_test(CHILD(tree, 0)));

    for (pos = 1; res && (pos < nch); pos += 2)
	res = (validate_name(CHILD(tree, pos), "and")
	       && validate_not_test(CHILD(tree, 0)));

    return (res);

}   /* validate_and_test() */


validate_not_test(tree)
    node *tree;
{
    int nch = NCH(tree);
    int res = validate_ntype(tree, not_test) && ((nch == 1) || (nch == 2));

    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(tree)
    node *tree;
{
    int pos;
    int nch = NCH(tree);
    int res = (validate_ntype(tree, comparison)
	       && is_odd(nch)
	       && validate_expr(CHILD(tree, 0)));

    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(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
	 *  or a NAME with a string of either 'is' or 'in'
	 */
	tree = CHILD(tree, 0);
	switch (TYPE(tree)) {
	    case LESS:
	    case GREATER:
	    case EQEQUAL:
	    case EQUAL:
	    case LESSEQUAL:
	    case GREATEREQUAL:
	    case NOTEQUAL:
	      res = 1;
	      break;
	    case NAME:
	      res = ((strcmp(STR(tree), "in") == 0)
		     || (strcmp(STR(tree), "is") == 0));
	      if (!res) {
		  char buff[128];
		  sprintf(buff, "Illegal operator: '%s'.", STR(tree));
		  err_string(buff);
	      }
	      break;
	  default:
	      err_string("Illegal comparison operator type.");
	      break;
	}
    }
    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())
	    err_string("Unknown comparison operator.");
    }
    return (res);

}   /* validate_comp_op() */


validate_expr(tree)
    node *tree;
{
    int j;
    int nch = NCH(tree);
    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_xor_expr(CHILD(tree, j))
	       && validate_vbar(CHILD(tree, j - 1)));

    return (res);

}   /* validate_expr() */


validate_xor_expr(tree)
    node *tree;
{
    int j;
    int nch = NCH(tree);
    int res = (validate_ntype(tree, xor_expr)
	       && is_odd(nch)
	       && validate_and_expr(CHILD(tree, 0)));

    for (j = 2; res && (j < nch); j += 2)
	res = (validate_circumflex(CHILD(tree, j - 1))
	       && validate_and_expr(CHILD(tree, j)));

    return (res);

}   /* validate_xor_expr() */


validate_and_expr(tree)
    node *tree;
{
    int pos;
    int nch = NCH(tree);
    int res = (validate_ntype(tree, and_expr)
	       && is_odd(nch)
	       && validate_shift_expr(CHILD(tree, 0)));

    for (pos = 1; res && (pos < nch); pos += 2)
	res = (validate_ampersand(CHILD(tree, pos))
	       && validate_shift_expr(CHILD(tree, pos + 1)));

    return (res);

}   /* validate_and_expr() */


static int
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)
	       && (*termvalid)(CHILD(tree, 0)));

    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(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(tree)
    node *tree;
{
    return (validate_ntype(tree, arith_expr)
	    && validate_chain_two_ops(tree, validate_term, PLUS, MINUS));

}   /* validate_arith_expr() */


validate_term(tree)
    node *tree;
{
    int pos = 1;
    int nch = NCH(tree);
    int res = (validate_ntype(tree, term)
	       && is_odd(nch)
	       && validate_factor(CHILD(tree, 0)));

    for ( ; res && (pos < nch); pos += 2)
	res = (((TYPE(CHILD(tree, pos)) == STAR)
	       || (TYPE(CHILD(tree, pos)) == SLASH)
	       || (TYPE(CHILD(tree, pos)) == PERCENT))
	       && validate_factor(CHILD(tree, pos + 1)));

    return (res);

}   /* validate_term() */


/*  factor:
 *
 *  factor: ('+'|'-'|'~') factor | power
 */
validate_factor(tree)
    node *tree;
{
    int nch = NCH(tree);
    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() */


/*  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 = validate_ntype(tree, atom) && (nch >= 1);

    if (res) {
	switch (TYPE(CHILD(tree, 0))) {
	  case LPAR:
	    res = ((nch <= 3)
		   && (validate_rparen(CHILD(tree, nch - 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_testlist(CHILD(tree, 1));
	    break;
	  case LBRACE:
	    res = ((nch <= 3)
		   && validate_ntype(CHILD(tree, nch - 1), RBRACE));

	    if (res && (nch == 3))
		res = validate_dictmaker(CHILD(tree, 1));
	    break;
	  case BACKQUOTE:
	    res = ((nch == 3)
		   && validate_testlist(CHILD(tree, 1))
		   && validate_ntype(CHILD(tree, 2), BACKQUOTE));
	    break;
	  case NAME:
	  case NUMBER:
	    res = (nch == 1);
	    break;
	  case STRING:
	    for (pos = 1; res && (pos < nch); ++pos)
		res = validate_ntype(CHILD(tree, pos), STRING);
	    break;
	  default:
	    res = 0;
	    break;
	}
    }
    return (res);

}   /* validate_atom() */


/*  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_colon(CHILD(tree, 3))
	    && validate_parameters(CHILD(tree, 2))
	    && validate_suite(CHILD(tree, 4)));

}   /* validate_funcdef() */


validate_lambdef(tree)
    node *tree;
{
    int nch = NCH(tree);
    int res = (validate_ntype(tree, lambdef)
	       && ((nch == 3) || (nch == 4))
	       && validate_name(CHILD(tree, 0), "lambda")
	       && validate_colon(CHILD(tree, nch - 2))
	       && validate_test(CHILD(tree, nch - 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() */


/*  arglist:
 *
 *  argument (',' argument)* [',']
 */
validate_arglist(tree)
    node *tree;
{
    int nch = NCH(tree);
    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_arglist(CHILD(tree, 1));
	    break;
	  case LSQB:
	    res = (validate_numnodes(tree, 3, "trailer")
		   && validate_subscript(CHILD(tree, 1))
		   && validate_ntype(CHILD(tree, 2), RSQB));
	    break;
	  case DOT:
	    res = (validate_numnodes(tree, 2, "trailer")
		   && validate_ntype(CHILD(tree, 1), NAME));
	    break;
	  default:
	    res = 0;
	    break;
	}
    }
    else
	validate_numnodes(tree, 2, "trailer");

    return (res);

}   /* validate_trailer() */


/*  subscript:
 *
 *  test (',' test)* [','] | [test] ':' [test]
 */
validate_subscript(tree)
    node *tree;
{
    int nch = NCH(tree);
    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)) {
	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 (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(tree)
    node *tree;
{
    int nch = NCH(tree);
    int res = (validate_ntype(tree, exprlist)
	       && (nch >= 1)
	       && validate_expr(CHILD(tree, 0)));

    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)
	    res = (validate_comma(CHILD(tree, pos))
		   && validate_expr(CHILD(tree, pos + 1)));
    }
    return (res);

}   /* validate_exprlist() */


validate_dictmaker(tree)
    node *tree;
{
    int nch = NCH(tree);
    int res = (validate_ntype(tree, dictmaker)
	       && (nch >= 3)
	       && validate_test(CHILD(tree, 0))
	       && validate_colon(CHILD(tree, 1))
	       && validate_test(CHILD(tree, 2)));

    if (res && ((nch % 4) == 0))
	res = validate_comma(CHILD(tree, --nch));
    else if (res)
	res = ((nch % 4) == 3);

    if (res && (nch > 3)) {
	int pos = 3;
	/*  ( ',' test ':' test )*  */
	while (res && (pos < nch)) {
	    res = (validate_comma(CHILD(tree, pos))
		   && validate_test(CHILD(tree, pos + 1))
		   && validate_colon(CHILD(tree, pos + 2))
		   && validate_test(CHILD(tree, pos + 3)));
	    pos += 4;
	}
    }
    return (res);

}   /* validate_dictmaker() */


validate_eval_input(tree)
    node *tree;
{
    int pos;
    int nch = NCH(tree);
    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)
	res = validate_ntype(CHILD(tree, pos), NEWLINE);

    return (res);

}   /* validate_eval_input() */


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;
	switch (TYPE(tree)) {
	    /*
	     *  Definition nodes.
	     */
	  case funcdef:
	    res = validate_funcdef(tree);
	    break;
	  case classdef:
	    res = validate_class(tree);
	    break;
	    /*
	     *  "Trivial" parse tree nodes.
	     *  (Why did I call these trivial?)
	     */
	  case stmt:
	    res = validate_stmt(tree);
	    break;
	  case small_stmt:
	    /*
	     *  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  = (validate_numnodes(tree, 1, "flow_stmt")
		    && ((TYPE(CHILD(tree, 0)) == break_stmt)
			|| (TYPE(CHILD(tree, 0)) == continue_stmt)
			|| (TYPE(CHILD(tree, 0)) == return_stmt)
			|| (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.
	     */
	  case simple_stmt:
	    res = validate_simple_stmt(tree);
	    break;
	  case compound_stmt:
	    res = validate_compound_stmt(tree);
	    break;
	    /*
	     *  Fundemental statements.
	     */
	  case expr_stmt:
	    res = validate_expr_stmt(tree);
	    break;
	  case print_stmt:
	    res = validate_print_stmt(tree);
	    break;
	  case del_stmt:
	    res = validate_del_stmt(tree);
	    break;
	  case pass_stmt:
	    res = (validate_numnodes(tree, 1, "pass")
		   && validate_name(CHILD(tree, 0), "pass"));
	    break;
	  case break_stmt:
	    res = (validate_numnodes(tree, 1, "break")
		   && validate_name(CHILD(tree, 0), "break"));
	    break;
	  case continue_stmt:
	    res = (validate_numnodes(tree, 1, "continue")
		   && validate_name(CHILD(tree, 0), "continue"));
	    break;
	  case return_stmt:
	    res = validate_return_stmt(tree);
	    break;
	  case raise_stmt:
	    res = validate_raise_stmt(tree);
	    break;
	  case import_stmt:
	    res = validate_import_stmt(tree);
	    break;
	  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;
	  case if_stmt:
	    res = validate_if(tree);
	    break;
	  case while_stmt:
	    res = validate_while(tree);
	    break;
	  case for_stmt:
	    res = validate_for(tree);
	    break;
	  case try_stmt:
	    res = validate_try(tree);
	    break;
	  case suite:
	    res = validate_suite(tree);
	    break;
	    /*
	     *  Expression nodes.
	     */
	  case testlist:
	    res = validate_testlist(tree);
	    break;
	  case test:
	    res = validate_test(tree);
	    break;
	  case and_test:
	    res = validate_and_test(tree);
	    break;
	  case not_test:
	    res = validate_not_test(tree);
	    break;
	  case comparison:
	    res = validate_comparison(tree);
	    break;
	  case exprlist:
	    res = validate_exprlist(tree);
	    break;
	  case comp_op:
	    res = validate_comp_op(tree);
	    break;
	  case expr:
	    res = validate_expr(tree);
	    break;
	  case xor_expr:
	    res = validate_xor_expr(tree);
	    break;
	  case and_expr:
	    res = validate_and_expr(tree);
	    break;
	  case shift_expr:
	    res = validate_shift_expr(tree);
	    break;
	  case arith_expr:
	    res = validate_arith_expr(tree);
	    break;
	  case term:
	    res = validate_term(tree);
	    break;
	  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;
	}
	tree = next;
    }
    return (res);

}   /* validate_node() */


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() */


/*  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 ( ; 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 to allow
 *  inheritance.
 */
static PyMethodDef parser_functions[] =  {
    {"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()
 {
    PyObject* module = Py_InitModule("parser", parser_functions);
    PyObject* dict   = PyModule_GetDict(module);

    parser_error = PyString_FromString("parser.ParserError");

    if ((parser_error == 0)
	|| (PyDict_SetItemString(dict, "ParserError", parser_error) != 0)) {
	/*
	 *  This is serious.
	 */
	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__",
			 PyString_FromString(parser_doc_string));
    PyDict_SetItemString(dict, "__version__",
			 PyString_FromString(parser_version_string));

}   /* initparser() */


/*
 *  end of parsermodule.c
 */
