source: trunk/yao/share/antlr-2.7.7/lib/cpp/antlr/AST.hpp @ 1

Last change on this file since 1 was 1, checked in by lnalod, 15 years ago

Initial import of YAO sources

File size: 5.2 KB
Line 
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__
Note: See TracBrowser for help on using the repository browser.