]>
Commit | Line | Data |
---|---|---|
427c49bc A |
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 | |
18 | namespace antlr { | |
19 | #endif | |
20 | ||
21 | struct ASTRef; | |
22 | ||
23 | class ANTLR_API AST { | |
24 | public: | |
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 | ||
133 | private: | |
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 | |
143 | inline 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 | ||
150 | extern ANTLR_API RefAST nullAST; | |
151 | extern 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 ? | |
156 | inline 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__ |