You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
4.7 KiB
140 lines
4.7 KiB
/** 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
|
|
|
|
|