blob: 39096f8a0503eca788e0da4a0caf02e64487bd07 [file] [log] [blame]
/** Interface for an ANTLR3 common tree which is what gets
* passed around by the AST producing parser.
*/
#ifndef _ANTLR3_COMMON_TREE_HPP
#define _ANTLR3_COMMON_TREE_HPP
// [The "BSD licence"]
// Copyright (c) 2005-2009 Gokulakannan Somasundaram, ElectronDB
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1. Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in the
// documentation and/or other materials provided with the distribution.
// 3. The name of the author may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "antlr3defs.hpp"
ANTLR_BEGIN_NAMESPACE()
template<class ImplTraits>
class CommonTree : public ImplTraits::AllocPolicyType
{
public:
typedef typename ImplTraits::AllocPolicyType AllocPolicyType;
typedef typename ImplTraits::StringType StringType;
typedef typename ImplTraits::CommonTokenType CommonTokenType;
typedef typename ImplTraits::TreeType TreeType;
typedef CommonTree TokenType;
typedef typename AllocPolicyType::template VectorType<TreeType*> ChildrenType;
typedef typename AllocPolicyType::template ListType<TreeType*> ChildListType;
private:
/// The list of all the children that belong to this node. They are not part of the node
/// as they belong to the common tree node that implements this.
///
ChildrenType m_children;
/// This is used to store the current child index position while descending
/// and ascending trees as the tree walk progresses.
///
ANTLR_MARKER m_savedIndex;
/// Start token index that encases this tree
///
ANTLR_MARKER m_startIndex;
/// End token that encases this tree
///
ANTLR_MARKER m_stopIndex;
/// A single token, this is the payload for the tree
///
CommonTokenType* m_token;
/// Points to the node that has this node as a child.
/// If this is NULL, then this is the root node.
///
CommonTree* m_parent;
/// What index is this particular node in the child list it
/// belongs to?
///
ANTLR_INT32 m_childIndex;
public:
CommonTree();
CommonTree( CommonTokenType* token );
CommonTree( CommonTree* token );
CommonTree( const CommonTree& ctree );
TokenType* get_token() const;
ChildrenType& get_children();
const ChildrenType& get_children() const;
ChildrenType* get_children_p();
ANTLR_INT32 get_childIndex() const;
TreeType* get_parent() const;
void set_parent( TreeType* parent);
void set_childIndex( ANTLR_INT32 );
void addChild(TreeType* child);
/// Add all elements of the supplied list as children of this node
///
void addChildren(const ChildListType& kids);
void createChildrenList();
TreeType* deleteChild(ANTLR_UINT32 i);
/// Delete children from start to stop and replace with t even if t is
/// a list (nil-root tree). Num of children can increase or decrease.
/// For huge child lists, inserting children can force walking rest of
/// children to set their child index; could be slow.
///
void replaceChildren(ANTLR_INT32 startChildIndex, ANTLR_INT32 stopChildIndex, TreeType* t);
CommonTree* dupNode() const;
TreeType* dupTree();
ANTLR_UINT32 getCharPositionInLine();
TreeType* getChild(ANTLR_UINT32 i);
ANTLR_UINT32 getChildCount() const;
ANTLR_UINT32 getType();
TreeType* getFirstChildWithType(ANTLR_UINT32 type);
ANTLR_UINT32 getLine();
StringType getText();
bool isNilNode();
void setChild(ANTLR_UINT32 i, TreeType* child);
StringType toStringTree();
StringType toString();
void freshenPACIndexesAll();
void freshenPACIndexes(ANTLR_UINT32 offset);
void reuse();
~CommonTree();
};
ANTLR_END_NAMESPACE()
#include "antlr3commontree.inl"
#endif