1#ifndef INC_AST_hpp__ 2#define INC_AST_hpp__ 3 4/* ANTLR Translator Generator 5 * Project led by Terence Parr at http://www.jGuru.com 6 * Software rights: http://www.antlr.org/license.html 7 * 8 * $Id: //depot/code/org.antlr/release/antlr-2.7.7/lib/cpp/antlr/AST.hpp#2 $ 9 */ 10 11#include <antlr/config.hpp> 12#include <antlr/ASTRefCount.hpp> 13#include <antlr/Token.hpp> 14#include <vector> 15#include <string> 16 17#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE 18namespace antlr { 19#endif 20 21struct ASTRef; 22 23class ANTLR_API AST { 24public: 25 AST() : ref(0) {} 26 AST(const AST&) : ref(0) {} 27 virtual ~AST() {} 28 29 /// Return the type name for this AST node. (for XML output) 30 virtual const char* typeName( void ) const = 0; 31 /// Clone this AST node. 32 virtual RefAST clone( void ) const = 0; 33 /// Is node t equal to this in terms of token type and text? 34 virtual bool equals(RefAST t) const = 0; 35 /** Is t an exact structural and equals() match of this tree. The 36 * 'this' reference is considered the start of a sibling list. 37 */ 38 virtual bool equalsList(RefAST t) const = 0; 39 40 /** Is 't' a subtree of this list? The siblings of the root are NOT ignored. 41 */ 42 virtual bool equalsListPartial(RefAST t) const = 0; 43 /** Is tree rooted at 'this' equal to 't'? The siblings of 'this' are 44 * ignored. 45 */ 46 virtual bool equalsTree(RefAST t) const = 0; 47 /** Is 't' a subtree of the tree rooted at 'this'? The siblings of 48 * 'this' are ignored. 49 */ 50 virtual bool equalsTreePartial(RefAST t) const = 0; 51 52 /** Walk the tree looking for all exact subtree matches. Return 53 * a vector of RefAST that lets the caller walk the list 54 * of subtree roots found herein. 55 */ 56 virtual ANTLR_USE_NAMESPACE(std)vector<RefAST> findAll(RefAST t) = 0; 57 58 /** Walk the tree looking for all subtrees. Return 59 * a vector of RefAST that lets the caller walk the list 60 * of subtree roots found herein. 61 */ 62 virtual ANTLR_USE_NAMESPACE(std)vector<RefAST> findAllPartial(RefAST t) = 0; 63 64 /// Add a node to the end of the child list for this node 65 virtual void addChild(RefAST c) = 0; 66 /// Get the number of children. Returns 0 if the node is a leaf 67 virtual size_t getNumberOfChildren() const = 0; 68 69 /// Get the first child of this node; null if no children 70 virtual RefAST getFirstChild() const = 0; 71 /// Get the next sibling in line after this one 72 virtual RefAST getNextSibling() const = 0; 73 74 /// Get the token text for this node 75 virtual ANTLR_USE_NAMESPACE(std)string getText() const = 0; 76 /// Get the token type for this node 77 virtual int getType() const = 0; 78 79 /** Various initialization routines. Used by several factories to initialize 80 * an AST element. 81 */ 82 virtual void initialize(int t, const ANTLR_USE_NAMESPACE(std)string& txt) = 0; 83 virtual void initialize(RefAST t) = 0; 84 virtual void initialize(RefToken t) = 0; 85 86#ifdef ANTLR_SUPPORT_XML 87 /** initialize this node from the contents of a stream. 88 * @param in the stream to read the AST attributes from. 89 */ 90 virtual void initialize( ANTLR_USE_NAMESPACE(std)istream& in ) = 0; 91#endif 92 93 /// Set the first child of a node. 94 virtual void setFirstChild(RefAST c) = 0; 95 /// Set the next sibling after this one. 96 virtual void setNextSibling(RefAST n) = 0; 97 98 /// Set the token text for this node 99 virtual void setText(const ANTLR_USE_NAMESPACE(std)string& txt) = 0; 100 /// Set the token type for this node 101 virtual void setType(int type) = 0; 102 103 /// Return this AST node as a string 104 virtual ANTLR_USE_NAMESPACE(std)string toString() const = 0; 105 106 /// Print out a child-sibling tree in LISP notation 107 virtual ANTLR_USE_NAMESPACE(std)string toStringList() const = 0; 108 virtual ANTLR_USE_NAMESPACE(std)string toStringTree() const = 0; 109 110#ifdef ANTLR_SUPPORT_XML 111 /** get attributes of this node to 'out'. Override to customize XML 112 * output. 113 * @param out the stream to write the AST attributes to. 114 * @returns if a explicit closetag should be written 115 */ 116 virtual bool attributesToStream( ANTLR_USE_NAMESPACE(std)ostream& out ) const = 0; 117 118 /** Print a symbol over ostream. Overload this one to customize the XML 119 * output for AST derived AST-types 120 * @param output stream 121 */ 122 virtual void toStream( ANTLR_USE_NAMESPACE(std)ostream &out ) const = 0; 123 124 /** Dump AST contents in XML format to output stream. 125 * Works in conjunction with to_stream method. Overload that one is 126 * derived classes to customize behaviour. 127 * @param output stream to write to string to put the stuff in. 128 * @param ast RefAST object to write. 129 */ 130 friend ANTLR_USE_NAMESPACE(std)ostream& operator<<( ANTLR_USE_NAMESPACE(std)ostream& output, const RefAST& ast ); 131#endif 132 133private: 134 friend struct ASTRef; 135 ASTRef* ref; 136 137 AST(RefAST other); 138 AST& operator=(const AST& other); 139 AST& operator=(RefAST other); 140}; 141 142#ifdef ANTLR_SUPPORT_XML 143inline ANTLR_USE_NAMESPACE(std)ostream& operator<<( ANTLR_USE_NAMESPACE(std)ostream& output, const RefAST& ast ) 144{ 145 ast->toStream(output); 146 return output; 147} 148#endif 149 150extern ANTLR_API RefAST nullAST; 151extern ANTLR_API AST* const nullASTptr; 152 153#ifdef NEEDS_OPERATOR_LESS_THAN 154// RK: apparently needed by MSVC and a SUN CC, up to and including 155// 2.7.2 this was undefined ? 156inline bool operator<( RefAST l, RefAST r ) 157{ 158 return nullAST == l ? ( nullAST == r ? false : true ) : l->getType() < r->getType(); 159} 160#endif 161 162#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE 163} 164#endif 165 166#endif //INC_AST_hpp__ 167