/* Abstract syntax tree
 *
 * SOFTWARE RIGHTS
 *
 * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
 * Set (PCCTS) -- PCCTS is in the public domain.  An individual or
 * company may do whatever they wish with source code distributed with
 * PCCTS or the code generated by PCCTS, including the incorporation of
 * PCCTS, or its output, into commerical software.
 *
 * We encourage users to develop software with PCCTS.  However, we do ask
 * that credit is given to us for developing PCCTS.  By "credit",
 * we mean that if you incorporate our source code into one of your
 * programs (commercial product, research project, or otherwise) that you
 * acknowledge this fact somewhere in the documentation, research report,
 * etc...  If you like PCCTS and have developed a nice tool with the
 * output, please mention that you developed it using PCCTS.  In
 * addition, we ask that this header remain intact in our source code.
 * As long as these guidelines are kept, we expect to continue enhancing
 * this system and expect to make other tools available as they are
 * completed.
 *
 * ANTLR 1.33
 * Terence Parr
 * Parr Research Corporation
 * with Purdue University and AHPCRC, University of Minnesota
 * 1989-1998
 */

#ifndef ASTBase_H
#define ASTBase_H

#include "pcctscfg.h"

#include "pccts_stdio.h"
#include "pccts_stdlib.h"

PCCTS_NAMESPACE_STD

#ifndef PCCTS_NOT_USING_SOR
#include "PCCTSAST.h"
#endif

/*
 * Notes:
 *
 * To specify a copy constructor, subclass one of these classes and
 * give the copy constructor.  To use dup(), you must define shallowCopy().
 * shallowCopy() can use either a copy constructor or just copy the node
 * itself.
 */

#ifdef PCCTS_NOT_USING_SOR
class DllExportPCCTS ASTBase {
#else
class DllExportPCCTS ASTBase : public PCCTS_AST {
#endif

protected:
  ASTBase *_right, *_down;

public:

#ifdef PCCTS_NOT_USING_SOR
  ASTBase *right()  { return _right; }
  ASTBase *down()      { return _down; }
  void setRight(ASTBase *t)  { _right = (ASTBase *)t; }
  void setDown(ASTBase *t)  { _down = (ASTBase *)t; }
#else
  PCCTS_AST *right()  { return _right; }  // define the SORCERER interface
  PCCTS_AST *down()  { return _down; }
  void setRight(PCCTS_AST *t)  { _right = (ASTBase *)t; }
  void setDown(PCCTS_AST *t)  { _down = (ASTBase *)t; }
#endif
  ASTBase() { _right = _down = NULL; }
  virtual ~ASTBase() { ; }
#ifndef PCCTS_NOT_USING_SOR
  virtual ASTBase *dup();
#endif
  void destroy();
  void preorder();
  static ASTBase *tmake(ASTBase *, ...);
  static void link(ASTBase **, ASTBase **, ASTBase **);
  void subchild(ASTBase **, ASTBase **, ASTBase **);
  void subroot(ASTBase **, ASTBase **, ASTBase **);
  virtual void preorder_action() { ; }
  virtual void preorder_before_action() { printf(" ("); }
  virtual void preorder_after_action() { printf(" )"); }
    virtual void panic(const char *msg);         /* MR21 */
    virtual void reportOverwriteOfDownPointer(); /* MR21 */
};

class DllExportPCCTS ASTDoublyLinkedBase : public ASTBase {
protected:
    ASTDoublyLinkedBase *_left, *_up;

public:
  void double_link(ASTBase *left, ASTBase *up);

#ifndef PCCTS_NOT_USING_SOR
  virtual ASTBase *dup();
#endif

#ifdef PCCTS_NOT_USING_SOR
  ASTBase *left() { return _left; }
  ASTBase *up() { return _up; }
  void setLeft(ASTBase *t) { _left = (ASTDoublyLinkedBase *)t; }    // MR6
  void setUp(ASTBase *t)   { _up = (ASTDoublyLinkedBase *)t; }      // MR6
#else
  PCCTS_AST *left() { return _left; }
  PCCTS_AST *up() { return _up; }
  void setLeft(PCCTS_AST *t) { _left = (ASTDoublyLinkedBase *)t; }  // MR6
  void setUp(PCCTS_AST *t)   { _up = (ASTDoublyLinkedBase *)t; }  // MR6
#endif

};

class AST;  // announce that this class will be coming along shortly
#endif
