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