summaryrefslogtreecommitdiffstats
path: root/contrib/libs/antlr3_cpp_runtime/include
diff options
context:
space:
mode:
authormaxim-yurchuk <[email protected]>2024-10-09 12:29:46 +0300
committermaxim-yurchuk <[email protected]>2024-10-09 13:14:22 +0300
commit9731d8a4bb7ee2cc8554eaf133bb85498a4c7d80 (patch)
treea8fb3181d5947c0d78cf402aa56e686130179049 /contrib/libs/antlr3_cpp_runtime/include
parenta44b779cd359f06c3ebbef4ec98c6b38609d9d85 (diff)
publishFullContrib: true for ydb
<HIDDEN_URL> commit_hash:c82a80ac4594723cebf2c7387dec9c60217f603e
Diffstat (limited to 'contrib/libs/antlr3_cpp_runtime/include')
-rw-r--r--contrib/libs/antlr3_cpp_runtime/include/antlr3.inl9
-rw-r--r--contrib/libs/antlr3_cpp_runtime/include/antlr3rewritestreams.hpp299
-rw-r--r--contrib/libs/antlr3_cpp_runtime/include/antlr3rewritestreams.inl363
3 files changed, 671 insertions, 0 deletions
diff --git a/contrib/libs/antlr3_cpp_runtime/include/antlr3.inl b/contrib/libs/antlr3_cpp_runtime/include/antlr3.inl
new file mode 100644
index 00000000000..b2d223398d5
--- /dev/null
+++ b/contrib/libs/antlr3_cpp_runtime/include/antlr3.inl
@@ -0,0 +1,9 @@
+namespace antlr3 {
+
+//static
+ANTLR_INLINE void GenericStream::displayRecognitionError( const StringType& str )
+{
+ fprintf(stderr, str.c_str() );
+}
+
+}
diff --git a/contrib/libs/antlr3_cpp_runtime/include/antlr3rewritestreams.hpp b/contrib/libs/antlr3_cpp_runtime/include/antlr3rewritestreams.hpp
new file mode 100644
index 00000000000..a8d73966432
--- /dev/null
+++ b/contrib/libs/antlr3_cpp_runtime/include/antlr3rewritestreams.hpp
@@ -0,0 +1,299 @@
+#ifndef ANTLR3REWRITESTREAM_HPP
+#define ANTLR3REWRITESTREAM_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.
+
+/// A generic list of elements tracked in an alternative to be used in
+/// a -> rewrite rule.
+///
+/// In the C implementation, all tree oriented streams return a pointer to
+/// the same type: pANTLR3_BASE_TREE. Anything that has subclassed from this
+/// still passes this type, within which there is a super pointer, which points
+/// to it's own data and methods. Hence we do not need to implement this as
+/// the equivalent of an abstract class, but just fill in the appropriate interface
+/// as usual with this model.
+///
+/// Once you start next()ing, do not try to add more elements. It will
+/// break the cursor tracking I believe.
+///
+///
+/// \see #pANTLR3_REWRITE_RULE_NODE_STREAM
+/// \see #pANTLR3_REWRITE_RULE_ELEMENT_STREAM
+/// \see #pANTLR3_REWRITE_RULE_SUBTREE_STREAM
+///
+/// TODO: add mechanism to detect/puke on modification after reading from stream
+///
+namespace antlr3 {
+
+template<class ImplTraits, class ElementType>
+//template<class ImplTraits>
+class RewriteRuleElementStream : public ImplTraits::AllocPolicyType
+{
+public:
+ //typedef typename ElementTypePtr::element_type ElementType; unique_ptr
+ //typedef typename ImplTraits::TreeType TreeType;
+ typedef typename ImplTraits::AllocPolicyType AllocPolicyType;
+ typedef typename ImplTraits::TreeAdaptorType TreeAdaptorType;
+
+ //typedef typename ImplTraits::template RecognizerType< typename SuperType::StreamType > RecognizerType;
+ typedef typename ImplTraits::StringType StringType;
+ typedef typename AllocPolicyType::template VectorType< ElementType* > ElementsType;
+
+protected:
+ /// The list of tokens or subtrees we are tracking
+ ///
+ ElementsType m_elements;
+
+ /// The element or stream description; usually has name of the token or
+ /// rule reference that this list tracks. Can include rulename too, but
+ /// the exception would track that info.
+ ///
+ StringType m_elementDescription;
+
+private:
+ ElementType* dupImpl(typename ImplTraits::CommonTokenType* el);
+ ElementType* dupImpl(typename ImplTraits::TreeTypePtr el);
+
+
+ /// Pointer to the tree adaptor in use for this stream
+ ///
+ TreeAdaptorType* m_adaptor;
+
+ /// Cursor 0..n-1. If singleElement!=NULL, cursor is 0 until you next(),
+ /// which bumps it to 1 meaning no more elements.
+ ///
+ ANTLR_UINT32 m_cursor;
+
+ /// Once a node / subtree has been used in a stream, it must be dup'ed
+ /// from then on. Streams are reset after sub rules so that the streams
+ /// can be reused in future sub rules. So, reset must set a dirty bit.
+ /// If dirty, then next() always returns a dup.
+ ///
+ bool m_dirty;
+
+public:
+ RewriteRuleElementStream(TreeAdaptorType* adaptor, const char* description);
+ RewriteRuleElementStream(TreeAdaptorType* adaptor, const char* description, const ElementType* oneElement);
+ RewriteRuleElementStream(TreeAdaptorType* adaptor, const char* description, const ElementsType& elements);
+
+ ~RewriteRuleElementStream();
+ // Methods
+
+ /// Reset the condition of this stream so that it appears we have
+ /// not consumed any of its elements. Elements themselves are untouched.
+ ///
+ void reset();
+
+ /// Add a new pANTLR3_BASE_TREE to this stream
+ ///
+ void add(ElementType* el);
+
+ /// Return the next element in the stream. If out of elements, throw
+ /// an exception unless size()==1. If size is 1, then return elements[0].
+ ///
+ //TokenType* next();
+ ElementType nextTree();
+ //TokenType* nextToken();
+ ElementType* _next();
+
+ /// When constructing trees, sometimes we need to dup a token or AST
+ /// subtree. Dup'ing a token means just creating another AST node
+ /// around it. For trees, you must call the adaptor.dupTree().
+ ///
+ ElementType* dup( ElementType* el );
+
+ /// Ensure stream emits trees; tokens must be converted to AST nodes.
+ /// AST nodes can be passed through unmolested.
+ ///
+ ElementType* toTree(ElementType* el);
+
+ /// Returns true if there is a next element available
+ ///
+ bool hasNext();
+
+ /// Treat next element as a single node even if it's a subtree.
+ /// This is used instead of next() when the result has to be a
+ /// tree root node. Also prevents us from duplicating recently-added
+ /// children; e.g., ^(type ID)+ adds ID to type and then 2nd iteration
+ /// must dup the type node, but ID has been added.
+ ///
+ /// Referencing to a rule result twice is ok; dup entire tree as
+ /// we can't be adding trees; e.g., expr expr.
+ ///
+ //TreeTypePtr nextNode();
+
+ /// Number of elements available in the stream
+ ///
+ ANTLR_UINT32 size();
+
+ /// Returns the description string if there is one available (check for NULL).
+ ///
+ StringType getDescription();
+
+protected:
+ void init(TreeAdaptorType* adaptor, const char* description);
+};
+
+/// This is an implementation of a token stream, which is basically an element
+/// stream that deals with tokens only.
+///
+template<class ImplTraits>
+//class RewriteRuleTokenStream : public ImplTraits::template RewriteRuleElementStreamType< typename ImplTraits::ParserType>
+class RewriteRuleTokenStream
+ //: public ImplTraits::template RewriteStreamType< const typename ImplTraits::CommonTokenType >
+{
+public:
+ typedef typename ImplTraits::AllocPolicyType AllocPolicyType;
+ typedef typename ImplTraits::TreeAdaptorType TreeAdaptorType;
+ typedef typename ImplTraits::ParserType ComponentType;
+ typedef typename ComponentType::StreamType StreamType;
+ typedef typename ImplTraits::CommonTokenType TokenType;
+ typedef typename ImplTraits::TreeType TreeType;
+ typedef typename ImplTraits::TreeTypePtr TreeTypePtr;
+ typedef typename AllocPolicyType::template VectorType< TokenType* > ElementsType;
+ typedef typename ImplTraits::template RecognizerType< StreamType > RecognizerType;
+ typedef typename ImplTraits::template RewriteStreamType< const typename ImplTraits::CommonTokenType > BaseType;
+
+public:
+ RewriteRuleTokenStream(TreeAdaptorType* adaptor, const char* description);
+ RewriteRuleTokenStream(TreeAdaptorType* adaptor, const char* description, const TokenType* oneElement);
+ RewriteRuleTokenStream(TreeAdaptorType* adaptor, const char* description, const ElementsType& elements);
+
+ TreeTypePtr nextNode();
+ TokenType* nextToken();
+
+ /// TODO copied from RewriteRuleElementStreamType
+ /// Add a new pANTLR3_BASE_TREE to this stream
+ ///
+ typedef typename ImplTraits::CommonTokenType ElementType;
+ void add(const ElementType* el);
+ /// Pointer to the tree adaptor in use for this stream
+ ///
+ TreeAdaptorType* m_adaptor;
+ ElementType* _next();
+
+private:
+ //TreeTypePtr nextNodeToken();
+};
+
+/// This is an implementation of a subtree stream which is a set of trees
+/// modeled as an element stream.
+///
+template<class ImplTraits>
+//class RewriteRuleSubtreeStream : public ImplTraits::template RewriteStreamType< typename ImplTraits::TreeParserType>
+class RewriteRuleSubtreeStream
+ //: public ImplTraits::template RewriteStreamType< typename ImplTraits::TreeType >
+{
+public:
+ typedef typename ImplTraits::AllocPolicyType AllocPolicyType;
+ typedef typename ImplTraits::TreeAdaptorType TreeAdaptorType;
+ typedef typename ImplTraits::TreeParserType ComponentType;
+ typedef typename ComponentType::StreamType StreamType;
+ typedef typename ImplTraits::TreeType TreeType;
+ typedef typename ImplTraits::TreeTypePtr TreeTypePtr;
+ typedef TreeType TokenType;
+ typedef typename ImplTraits::template RecognizerType< StreamType > RecognizerType;
+ typedef typename AllocPolicyType::template VectorType< TokenType* > ElementsType;
+ typedef typename ImplTraits::template RewriteStreamType< typename ImplTraits::TreeType > BaseType;
+
+ RewriteRuleSubtreeStream(TreeAdaptorType* adaptor, const char* description);
+ RewriteRuleSubtreeStream(TreeAdaptorType* adaptor, const char* description, TreeTypePtr& oneElement);
+ RewriteRuleSubtreeStream(TreeAdaptorType* adaptor, const char* description, const ElementsType& elements);
+
+ TreeTypePtr nextNode(TreeTypePtr);
+
+ /// TODO copied from RewriteRuleElementStreamType
+ /// Add a new pANTLR3_BASE_TREE to this stream
+ ///
+ void add(TreeTypePtr& el);
+ bool hasNext();
+ TreeTypePtr& nextTree();
+ void reset();
+
+protected:
+ TreeTypePtr dup( TreeTypePtr el );
+
+private:
+ TreeTypePtr dupTree( TreeTypePtr el );
+};
+
+/* TODO This class is probably used in TreeParser only
+ * Notes about Java target
+ * - these classes reimplement only dup and toTree methods:
+ * base ElementStr
+ * abstract dup
+ * toTree(Object e) { return e; }
+ * TokenStr
+ * dup { throw }
+ * toTree(Object e) { return e; }
+ * SubTreeStr
+ * dup(Object e) { return adaptor.dupTree }
+ * NodeStr
+ * dup { throw }
+ * toTree(Object e) { return adaptor.dupNode }
+ * See: RewriteRuleElementStream::dup, RewriteRuleElementStream::dupImpl
+ *
+ * There should 3 types of specializations for RewriteRuleElementStreamType (which is not defined yet)
+ * ATM: RewriteRuleElementStreamType is replaced with ImplTraits::template RewriteStreamType
+ *
+/// This is an implementation of a node stream, which is basically an element
+/// stream that deals with tree nodes only.
+///
+template<class ImplTraits>
+//class RewriteRuleNodeStream : public ImplTraits::template RewriteStreamType< typename ImplTraits::TreeParserType>
+class RewriteRuleNodeStream : public ImplTraits::template RewriteStreamType< typename ImplTraits::TreeType >
+{
+public:
+ typedef typename ImplTraits::AllocPolicyType AllocPolicyType;
+ typedef typename ImplTraits::TreeAdaptorType TreeAdaptorType;
+ typedef typename ImplTraits::TreeParserType ComponentType;
+ typedef typename ComponentType::StreamType StreamType;
+ typedef typename ImplTraits::TreeType TreeType;
+ typedef TreeType TokenType;
+ typedef typename ImplTraits::template RecognizerType< StreamType > RecognizerType;
+ typedef typename AllocPolicyType::template VectorType< TokenType* > ElementsType;
+ typedef typename ImplTraits::template RewriteRuleElementStreamType< typename ImplTraits::TreeType > BaseType;
+
+public:
+ RewriteRuleNodeStream(TreeAdaptorType* adaptor, const char* description);
+ RewriteRuleNodeStream(TreeAdaptorType* adaptor, const char* description, TokenType* oneElement);
+ RewriteRuleNodeStream(TreeAdaptorType* adaptor, const char* description, const ElementsType& elements);
+
+protected:
+ TreeTypePtr toTree(TreeTypePtr element);
+
+private:
+ TreeTypePtr toTreeNode(TreeTypePtr element);
+};
+*/
+}
+
+#include "antlr3rewritestreams.inl"
+
+#endif
diff --git a/contrib/libs/antlr3_cpp_runtime/include/antlr3rewritestreams.inl b/contrib/libs/antlr3_cpp_runtime/include/antlr3rewritestreams.inl
new file mode 100644
index 00000000000..47568da6498
--- /dev/null
+++ b/contrib/libs/antlr3_cpp_runtime/include/antlr3rewritestreams.inl
@@ -0,0 +1,363 @@
+namespace antlr3 {
+
+template<class ImplTraits, class ElementType>
+RewriteRuleElementStream<ImplTraits, ElementType>::RewriteRuleElementStream(TreeAdaptorType* adaptor,
+ const char* description)
+{
+ this->init(adaptor, description);
+}
+
+template<class ImplTraits, class ElementType>
+RewriteRuleElementStream<ImplTraits, ElementType>::RewriteRuleElementStream(TreeAdaptorType* adaptor,
+ const char* description,
+ const ElementType* oneElement)
+{
+ this->init(adaptor, description);
+ if( oneElement != NULL )
+ this->add( oneElement );
+}
+
+template<class ImplTraits, class ElementType>
+RewriteRuleElementStream<ImplTraits, ElementType>::RewriteRuleElementStream(TreeAdaptorType* adaptor,
+ const char* description,
+ const ElementsType& elements)
+ : m_elements(elements)
+{
+ this->init(adaptor, description);
+}
+
+template<class ImplTraits, class ElementType>
+void RewriteRuleElementStream<ImplTraits, ElementType>::init(TreeAdaptorType* adaptor,
+ const char* description)
+{
+ m_adaptor = adaptor;
+ m_cursor = 0;
+ m_dirty = false;
+}
+
+template<class ImplTraits>
+RewriteRuleTokenStream<ImplTraits>::RewriteRuleTokenStream(TreeAdaptorType* adaptor,
+ const char* description)
+ //: BaseType(adaptor, description)
+{
+}
+
+template<class ImplTraits>
+RewriteRuleTokenStream<ImplTraits>::RewriteRuleTokenStream(TreeAdaptorType* adaptor,
+ const char* description,
+ const TokenType* oneElement)
+ //: BaseType(adaptor, description, oneElement)
+{
+}
+
+template<class ImplTraits>
+RewriteRuleTokenStream<ImplTraits>::RewriteRuleTokenStream(TreeAdaptorType* adaptor,
+ const char* description,
+ const ElementsType& elements)
+ //: BaseType(adaptor, description, elements)
+{
+}
+
+template<class ImplTraits>
+RewriteRuleSubtreeStream<ImplTraits>::RewriteRuleSubtreeStream(TreeAdaptorType* adaptor,
+ const char* description)
+ //: BaseType(adaptor, description)
+{
+}
+
+template<class ImplTraits>
+RewriteRuleSubtreeStream<ImplTraits>::RewriteRuleSubtreeStream(TreeAdaptorType* adaptor,
+ const char* description,
+ TreeTypePtr& oneElement)
+ //: BaseType(adaptor, description, oneElement)
+{
+}
+
+template<class ImplTraits>
+RewriteRuleSubtreeStream<ImplTraits>::RewriteRuleSubtreeStream(TreeAdaptorType* adaptor,
+ const char* description,
+ const ElementsType& elements)
+ //: BaseType(adaptor, description, elements)
+{
+}
+
+/*
+template<class ImplTraits>
+RewriteRuleNodeStream<ImplTraits>::RewriteRuleNodeStream(TreeAdaptorType* adaptor,
+ const char* description)
+ : BaseType(adaptor, description)
+{
+}
+
+template<class ImplTraits>
+RewriteRuleNodeStream<ImplTraits>::RewriteRuleNodeStream(TreeAdaptorType* adaptor,
+ const char* description,
+ TokenType* oneElement)
+ : BaseType(adaptor, description, oneElement)
+{
+}
+
+template<class ImplTraits>
+RewriteRuleNodeStream<ImplTraits>::RewriteRuleNodeStream(TreeAdaptorType* adaptor,
+ const char* description,
+ const ElementsType& elements)
+ : BaseType(adaptor, description, elements)
+{
+}
+*/
+
+template<class ImplTraits, class ElementType>
+void RewriteRuleElementStream<ImplTraits, ElementType>::reset()
+{
+ m_cursor = 0;
+ m_dirty = true;
+}
+
+template<class ImplTraits, class ElementType>
+void RewriteRuleElementStream<ImplTraits, ElementType>::add(ElementType* el)
+{
+ if ( el== NULL )
+ return;
+
+ m_elements.push_back(el);
+}
+
+template<class ImplTraits, class ElementType>
+ElementType* RewriteRuleElementStream<ImplTraits, ElementType>::_next()
+{
+ ANTLR_UINT32 n = this->size();
+
+ if (n == 0)
+ {
+ // This means that the stream is empty
+ return NULL; // Caller must cope with this (TODO throw RewriteEmptyStreamException)
+ }
+
+ // Traversed all the available elements already?
+ if ( m_cursor >= n) // out of elements?
+ {
+ if (n == 1)
+ {
+ // Special case when size is single element, it will just dup a lot
+ //return this->toTree(m_singleElement);
+ return this->toTree(m_elements.at(0));
+ }
+
+ // Out of elements and the size is not 1, so we cannot assume
+ // that we just duplicate the entry n times (such as ID ent+ -> ^(ID ent)+)
+ // This means we ran out of elements earlier than was expected.
+ //
+ return NULL; // Caller must cope with this (TODO throw RewriteEmptyStreamException)
+ }
+
+ // More than just a single element so we extract it from the
+ // vector.
+ ElementType* t = this->toTree(m_elements.at(m_cursor));
+ m_cursor++;
+ return t;
+}
+
+template<class ImplTraits, class ElementType>
+ElementType
+RewriteRuleElementStream<ImplTraits, ElementType>::nextTree()
+{
+ ANTLR_UINT32 n = this->size();
+ if ( m_dirty || ( (m_cursor >=n) && (n==1)) )
+ {
+ // if out of elements and size is 1, dup
+ ElementType* el = this->_next();
+ return this->dup(el);
+ }
+
+ // test size above then fetch
+ ElementType* el = this->_next();
+ return el;
+}
+
+/*
+template<class ImplTraits, class SuperType>
+typename RewriteRuleElementStream<ImplTraits, SuperType>::TokenType*
+RewriteRuleElementStream<ImplTraits, SuperType>::nextToken()
+{
+ return this->_next();
+}
+
+template<class ImplTraits, class SuperType>
+typename RewriteRuleElementStream<ImplTraits, SuperType>::TokenType*
+RewriteRuleElementStream<ImplTraits, SuperType>::next()
+{
+ ANTLR_UINT32 s;
+ s = this->size();
+ if ( (m_cursor >= s) && (s == 1) )
+ {
+ TreeTypePtr el;
+ el = this->_next();
+ return this->dup(el);
+ }
+ return this->_next();
+}
+
+*/
+
+template<class ImplTraits, class ElementType>
+ElementType*
+RewriteRuleElementStream<ImplTraits, ElementType>::dup( ElementType* element)
+{
+ return dupImpl(element);
+}
+
+template<class ImplTraits, class ElementType>
+ElementType*
+RewriteRuleElementStream<ImplTraits, ElementType>::dupImpl( typename ImplTraits::CommonTokenType* element)
+{
+ return NULL; // TODO throw here
+}
+
+template<class ImplTraits, class ElementType>
+ElementType*
+RewriteRuleElementStream<ImplTraits, ElementType>::dupImpl( typename ImplTraits::TreeTypePtr element)
+{
+ return m_adaptor->dupTree(element);
+}
+
+template<class ImplTraits>
+typename RewriteRuleSubtreeStream<ImplTraits>::TreeTypePtr
+RewriteRuleSubtreeStream<ImplTraits>::dup(TreeTypePtr element)
+{
+ return this->dupTree(element);
+}
+
+template<class ImplTraits>
+typename RewriteRuleSubtreeStream<ImplTraits>::TreeTypePtr
+RewriteRuleSubtreeStream<ImplTraits>::dupTree(TreeTypePtr element)
+{
+ return BaseType::m_adaptor->dupNode(element);
+}
+
+template<class ImplTraits, class ElementType>
+ElementType*
+RewriteRuleElementStream<ImplTraits, ElementType>::toTree( ElementType* element)
+{
+ return element;
+}
+
+/*
+template<class ImplTraits>
+typename RewriteRuleNodeStream<ImplTraits>::TreeTypePtr
+RewriteRuleNodeStream<ImplTraits>::toTree(TreeTypePtr element)
+{
+ return this->toTreeNode(element);
+}
+
+template<class ImplTraits>
+typename RewriteRuleNodeStream<ImplTraits>::TreeTypePtr
+RewriteRuleNodeStream<ImplTraits>::toTreeNode(TreeTypePtr element)
+{
+ return BaseType::m_adaptor->dupNode(element);
+}
+*/
+
+template<class ImplTraits, class ElementType>
+bool RewriteRuleElementStream<ImplTraits, ElementType>::hasNext()
+{
+ if ( !m_elements.empty() && m_cursor < m_elements.size())
+ {
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+template<class ImplTraits >
+typename RewriteRuleTokenStream<ImplTraits>::TreeTypePtr
+RewriteRuleTokenStream<ImplTraits>::nextNode()
+{
+ TokenType *Token = this->nextToken();
+ //return BaseType::m_adaptor->create(Token);
+ return m_adaptor->create(Token);
+}
+
+/*
+template<class ImplTraits>
+typename RewriteRuleTokenStream<ImplTraits>::TreeTypePtr
+RewriteRuleTokenStream<ImplTraits>::nextNodeToken()
+{
+ return BaseType::m_adaptor->create(this->_next());
+}
+*/
+
+/// Number of elements available in the stream
+///
+template<class ImplTraits, class ElementType>
+ANTLR_UINT32 RewriteRuleElementStream<ImplTraits, ElementType>::size()
+{
+ return (ANTLR_UINT32)(m_elements.size());
+}
+
+template<class ImplTraits, class ElementType>
+typename RewriteRuleElementStream<ImplTraits, ElementType>::StringType
+RewriteRuleElementStream<ImplTraits, ElementType>::getDescription()
+{
+ if ( m_elementDescription.empty() )
+ {
+ m_elementDescription = "<unknown source>";
+ }
+ return m_elementDescription;
+}
+
+template<class ImplTraits, class ElementType>
+RewriteRuleElementStream<ImplTraits, ElementType>::~RewriteRuleElementStream()
+{
+ // Before placing the stream back in the pool, we
+ // need to clear any vector it has. This is so any
+ // free pointers that are associated with the
+ // entries are called. However, if this particular function is called
+ // then we know that the entries in the stream are definitely
+ // tree nodes. Hence we check to see if any of them were nilNodes as
+ // if they were, we can reuse them.
+ //
+ // We have some elements to traverse
+ //
+ for (ANTLR_UINT32 i = 0; i < m_elements.size(); i++)
+ {
+ ElementType *tree = m_elements.at(i);
+ //if ( (tree != NULL) && tree->isNilNode() )
+ {
+ // Had to remove this for now, check is not comprehensive enough
+ // tree->reuse(tree);
+ }
+ }
+ m_elements.clear();
+}
+
+template<class ImplTraits>
+typename RewriteRuleTokenStream<ImplTraits>::TokenType*
+RewriteRuleTokenStream<ImplTraits>::nextToken()
+{
+ return this->_next();
+}
+
+template<class ImplTraits>
+typename RewriteRuleSubtreeStream<ImplTraits>::TreeTypePtr
+RewriteRuleSubtreeStream<ImplTraits>::nextNode(TreeTypePtr element)
+{
+ //System.out.println("nextNode: elements="+elements+", singleElement="+((Tree)singleElement).toStringTree());
+ ANTLR_UINT32 n = this->size();
+ if ( BaseType::m_dirty || (BaseType::m_cursor>=n && n==1) ) {
+ // if out of elements and size is 1, dup (at most a single node
+ // since this is for making root nodes).
+ TreeTypePtr el = this->_next();
+ return BaseType::m_adaptor->dupNode(el);
+ }
+ // test size above then fetch
+ TreeType *tree = this->_next();
+ while (BaseType::m_adaptor.isNil(tree) && BaseType::m_adaptor.getChildCount(tree) == 1)
+ tree = BaseType::m_adaptor->getChild(tree, 0);
+ //System.out.println("_next="+((Tree)tree).toStringTree());
+ TreeType *el = BaseType::m_adaptor->dupNode(tree); // dup just the root (want node here)
+ return el;
+}
+
+}