13eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/* Abstract syntax tree manipulation functions
23eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang *
33eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * SOFTWARE RIGHTS
43eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang *
53eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
63eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
73eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * company may do whatever they wish with source code distributed with
83eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * PCCTS or the code generated by PCCTS, including the incorporation of
93eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * PCCTS, or its output, into commerical software.
103eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang *
113eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * We encourage users to develop software with PCCTS.  However, we do ask
123eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * that credit is given to us for developing PCCTS.  By "credit",
133eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * we mean that if you incorporate our source code into one of your
143eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * programs (commercial product, research project, or otherwise) that you
153eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * acknowledge this fact somewhere in the documentation, research report,
163eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * etc...  If you like PCCTS and have developed a nice tool with the
173eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * output, please mention that you developed it using PCCTS.  In
183eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * addition, we ask that this header remain intact in our source code.
193eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * As long as these guidelines are kept, we expect to continue enhancing
203eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * this system and expect to make other tools available as they are
213eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * completed.
223eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang *
233eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * ANTLR 1.33
243eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * Terence Parr
253eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * Parr Research Corporation
263eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * with Purdue University and AHPCRC, University of Minnesota
273eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * 1989-1998
283eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang */
293eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
303eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#include "pcctscfg.h"
313eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
323eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#include "pccts_stdio.h"
333eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#include "pccts_stdarg.h"
343eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
353eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangPCCTS_NAMESPACE_STD
363eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
373eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#define ANTLR_SUPPORT_CODE
383eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
393eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#include "ASTBase.h"
403eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
413eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/* ensure that tree manipulation variables are current after a rule
423eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * reference
433eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang */
443eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangvoid
453eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangASTBase::link(ASTBase **_root, ASTBase **_sibling, ASTBase **_tail)
463eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang{
473eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	if ( *_sibling == NULL ) return;
483eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	if ( *_root == NULL ) *_root = *_sibling;
493eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	else if ( *_root != *_sibling ) (*_root)->_down = *_sibling;
503eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	if ( *_tail==NULL ) *_tail = *_sibling;
513eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	while ( (*_tail)->_right != NULL ) *_tail = (*_tail)->_right;
523eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang}
533eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
543eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/* add a child node to the current sibling list */
553eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangvoid
563eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangASTBase::subchild(ASTBase **_root, ASTBase **_sibling, ASTBase **_tail)
573eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang{
583eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	if ( *_tail != NULL ) (*_tail)->_right = this;
593eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	else {
603eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang		*_sibling = this;
613eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang		if ( *_root != NULL ) (*_root)->_down = *_sibling;
623eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	}
633eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	*_tail = this;
643eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	if ( *_root == NULL ) *_root = *_sibling;
653eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang}
663eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
673eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/* make a new AST node.  Make the newly-created
683eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * node the root for the current sibling list.  If a root node already
693eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * exists, make the newly-created node the root of the current root.
703eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang */
713eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangvoid
723eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangASTBase::subroot(ASTBase **_root, ASTBase **_sibling, ASTBase **_tail)
733eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang{
743eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	if ( *_root != NULL )
753eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang		if ( (*_root)->_down == *_sibling ) *_sibling = *_tail = *_root;
763eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	*_root = this;
773eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	(*_root)->_down = *_sibling;
783eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang}
793eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
803eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/* Apply preorder_action(), etc.. to root then each sibling */
813eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
823eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//  7-Apr-97 133MR1
833eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//	Fix suggested by Ron House (house@helios.usq.edu.au)
843eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
853eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangvoid
863eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangASTBase::preorder()
873eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang{
883eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	ASTBase *tree = this;
893eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
903eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	while ( tree!= NULL )
913eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	{
923eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang		if ( tree->_down != NULL ) {
933eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang			tree->preorder_before_action(); 		// MR1
943eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang		};
953eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang		tree->preorder_action();
963eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang		if ( tree->_down!=NULL )
973eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang		{
983eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang			tree->_down->preorder();
993eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang			tree->preorder_after_action();			// MR1
1003eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang		}
1013eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang		tree = tree->_right;
1023eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	}
1033eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang}
1043eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1053eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/* free all AST nodes in tree; apply func to each before freeing */
1063eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangvoid
1073eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangASTBase::destroy()
1083eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang{
1093eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang   ASTBase* tree = this;
1103eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang   while (tree) {
1113eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang      if (tree->_down) tree->_down->destroy();
1123eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1133eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang      ASTBase* cur = tree;
1143eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang      tree = tree->_right;
1153eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang      delete cur;
1163eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang   }
1173eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang}
1183eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1193eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/* build a tree (root child1 child2 ... NULL)
1203eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * If root is NULL, simply make the children siblings and return ptr
1213eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * to 1st sibling (child1).  If root is not single node, return NULL.
1223eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang *
1233eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * Siblings that are actually siblins lists themselves are handled
1243eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * correctly.  For example #( NULL, #( NULL, A, B, C), D) results
1253eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * in the tree ( NULL A B C D ).
1263eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang *
1273eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * Requires at least two parameters with the last one being NULL.  If
1283eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * both are NULL, return NULL.
1293eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang */
1303eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangASTBase *
1313eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangASTBase::tmake(ASTBase *root, ...)
1323eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang{
1333eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	va_list ap;
1343eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	register ASTBase *child, *sibling=NULL, *tail, *w;
1353eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1363eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	va_start(ap, root);
1373eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1383eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	if ( root != NULL )
1393eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang		if ( root->_down != NULL ) {
1403eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang            root->reportOverwriteOfDownPointer();  /* MR21 Report problem which almost always an error */
1413eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang            return NULL;
1423eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang        }
1433eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	child = va_arg(ap, ASTBase *);
1443eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	while ( child != NULL )
1453eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	{
1463eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang		for (w=child; w->_right!=NULL; w=w->_right) {;} /* find end of child */
1473eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang		if ( sibling == NULL ) {sibling = child; tail = w;}
1483eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang		else {tail->_right = child; tail = w;}
1493eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang		child = va_arg(ap, ASTBase *);
1503eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	}
1513eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	if ( root==NULL ) root = sibling;
1523eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	else root->_down = sibling;
1533eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	va_end(ap);
1543eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	return root;
1553eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang}
1563eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1573eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#ifndef PCCTS_NOT_USING_SOR
1583eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1593eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/* tree duplicate */
1603eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// forgot to check for NULL this (TJP July 23,1995)
1613eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangASTBase *
1623eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangASTBase::dup()
1633eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang{
1643eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	ASTBase *u, *t=this;
1653eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1663eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	if ( t == NULL ) return NULL;
1673eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/*
1683eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	u = new ASTBase;
1693eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	*u = *t;
1703eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang*/
1713eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	u = (ASTBase *)this->shallowCopy();
1723eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	if ( t->_right!=NULL ) u->_right = t->_right->dup();
1733eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	else u->_right = NULL;
1743eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	if ( t->_down!=NULL ) u->_down = t->_down->dup();
1753eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	else u->_down = NULL;
1763eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	return u;
1773eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang}
1783eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#endif
1793eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1803eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
1813eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//  7-Apr-97 133MR1
1823eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//  	     Fix suggested by Asgeir Olafsson (olafsson@cstar.ac.com)
1833eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang//
1843eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/* tree duplicate */
1853eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1863eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#ifndef PCCTS_NOT_USING_SOR
1873eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1883eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangASTBase *
1893eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangASTDoublyLinkedBase::dup()
1903eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang{
1913eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	ASTDoublyLinkedBase *u, *t=this;
1923eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
1933eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	if ( t == NULL ) return NULL;
1943eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	u = (ASTDoublyLinkedBase *)this->shallowCopy();
1953eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	u->_up = NULL;		/* set by calling invocation */
1963eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	u->_left = NULL;
1973eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	if (t->_right!=NULL) {						// MR1
1983eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang          u->_right=t->_right->dup();					// MR1
1993eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	  ((ASTDoublyLinkedBase *)u->_right)->_left = u;		// MR1
2003eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang        } else {							// MR1
2013eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	  u->_right = NULL;						// MR1
2023eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang        };								// MR1
2033eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	if (t->_down!=NULL) {						// MR1
2043eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang  	  u->_down = t->_down->dup();					// MR1
2053eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang          ((ASTDoublyLinkedBase *)u->_down)->_up = u;			// MR1
2063eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang        } else {							// MR1
2073eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	  u->_down = NULL;						// MR1
2083eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang        };								// MR1
2093eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	return u;
2103eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang}
2113eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2123eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang#endif
2133eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2143eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang/*
2153eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * Set the 'up', and 'left' pointers of all nodes in 't'.
2163eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang * Initial call is double_link(your_tree, NULL, NULL).
2173eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang */
2183eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangvoid
2193eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangASTDoublyLinkedBase::double_link(ASTBase *left, ASTBase *up)
2203eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang{
2213eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang    ASTDoublyLinkedBase *t = this;
2223eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2233eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang    t->_left = (ASTDoublyLinkedBase *) left;
2243eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang    t->_up = (ASTDoublyLinkedBase *) up;
2253eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang    if (t->_down != NULL)
2263eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang		((ASTDoublyLinkedBase *)t->_down)->double_link(NULL, t);
2273eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang    if (t->_right != NULL)
2283eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang		((ASTDoublyLinkedBase *)t->_right)->double_link(t, up);
2293eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang}
2303eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2313eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// MR21 ASTBase::reportOverwriteOfDownPointer
2323eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2333eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangvoid ASTBase::reportOverwriteOfDownPointer()
2343eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang{
2353eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang    panic("Attempt to overwrite down pointer in ASTBase::tmake");
2363eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang}
2373eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2383eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang// MR21 ASTBase::panic
2393eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang
2403eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwangvoid ASTBase::panic(const char *msg)
2413eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang{
2423eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	fprintf(stderr,"ASTBase panic: %s\n", msg);
2433eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang	exit(PCCTS_EXIT_FAILURE);
2443eb9473ea9a949badfe06ae61d2d3fcfa53651c7qwang}
245