summaryrefslogtreecommitdiff
path: root/impl/antlr/libantlr3c-3.4/src/antlr3commontreenodestream.c
diff options
context:
space:
mode:
Diffstat (limited to 'impl/antlr/libantlr3c-3.4/src/antlr3commontreenodestream.c')
-rw-r--r--impl/antlr/libantlr3c-3.4/src/antlr3commontreenodestream.c968
1 files changed, 0 insertions, 968 deletions
diff --git a/impl/antlr/libantlr3c-3.4/src/antlr3commontreenodestream.c b/impl/antlr/libantlr3c-3.4/src/antlr3commontreenodestream.c
deleted file mode 100644
index a759d34..0000000
--- a/impl/antlr/libantlr3c-3.4/src/antlr3commontreenodestream.c
+++ /dev/null
@@ -1,968 +0,0 @@
-/// \file
-/// Defines the implementation of the common node stream the default
-/// tree node stream used by ANTLR.
-///
-
-// [The "BSD licence"]
-// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
-// http://www.temporal-wave.com
-// http://www.linkedin.com/in/jimidle
-//
-// 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 <antlr3commontreenodestream.h>
-
-#ifdef ANTLR3_WINDOWS
-#pragma warning( disable : 4100 )
-#endif
-
-// COMMON TREE STREAM API
-//
-static void addNavigationNode (pANTLR3_COMMON_TREE_NODE_STREAM ctns, ANTLR3_UINT32 ttype);
-static ANTLR3_BOOLEAN hasUniqueNavigationNodes (pANTLR3_COMMON_TREE_NODE_STREAM ctns);
-static pANTLR3_BASE_TREE newDownNode (pANTLR3_COMMON_TREE_NODE_STREAM ctns);
-static pANTLR3_BASE_TREE newUpNode (pANTLR3_COMMON_TREE_NODE_STREAM ctns);
-static void reset (pANTLR3_COMMON_TREE_NODE_STREAM ctns);
-static void push (pANTLR3_COMMON_TREE_NODE_STREAM ctns, ANTLR3_INT32 index);
-static ANTLR3_INT32 pop (pANTLR3_COMMON_TREE_NODE_STREAM ctns);
-//static ANTLR3_INT32 index (pANTLR3_COMMON_TREE_NODE_STREAM ctns);
-static ANTLR3_UINT32 getLookaheadSize (pANTLR3_COMMON_TREE_NODE_STREAM ctns);
-// TREE NODE STREAM API
-//
-static pANTLR3_BASE_TREE_ADAPTOR getTreeAdaptor (pANTLR3_TREE_NODE_STREAM tns);
-static pANTLR3_BASE_TREE getTreeSource (pANTLR3_TREE_NODE_STREAM tns);
-static pANTLR3_BASE_TREE _LT (pANTLR3_TREE_NODE_STREAM tns, ANTLR3_INT32 k);
-static pANTLR3_BASE_TREE get (pANTLR3_TREE_NODE_STREAM tns, ANTLR3_INT32 k);
-static void setUniqueNavigationNodes (pANTLR3_TREE_NODE_STREAM tns, ANTLR3_BOOLEAN uniqueNavigationNodes);
-static pANTLR3_STRING toString (pANTLR3_TREE_NODE_STREAM tns);
-static pANTLR3_STRING toStringSS (pANTLR3_TREE_NODE_STREAM tns, pANTLR3_BASE_TREE start, pANTLR3_BASE_TREE stop);
-static void toStringWork (pANTLR3_TREE_NODE_STREAM tns, pANTLR3_BASE_TREE start, pANTLR3_BASE_TREE stop, pANTLR3_STRING buf);
-static void replaceChildren (pANTLR3_TREE_NODE_STREAM tns, pANTLR3_BASE_TREE parent, ANTLR3_INT32 startChildIndex, ANTLR3_INT32 stopChildIndex, pANTLR3_BASE_TREE t);
-
-// INT STREAM API
-//
-static void consume (pANTLR3_INT_STREAM is);
-static ANTLR3_MARKER tindex (pANTLR3_INT_STREAM is);
-static ANTLR3_UINT32 _LA (pANTLR3_INT_STREAM is, ANTLR3_INT32 i);
-static ANTLR3_MARKER mark (pANTLR3_INT_STREAM is);
-static void release (pANTLR3_INT_STREAM is, ANTLR3_MARKER marker);
-static void rewindMark (pANTLR3_INT_STREAM is, ANTLR3_MARKER marker);
-static void rewindLast (pANTLR3_INT_STREAM is);
-static void seek (pANTLR3_INT_STREAM is, ANTLR3_MARKER index);
-static ANTLR3_UINT32 size (pANTLR3_INT_STREAM is);
-
-
-// Helper functions
-//
-static void fillBuffer (pANTLR3_COMMON_TREE_NODE_STREAM ctns, pANTLR3_BASE_TREE t);
-static void fillBufferRoot (pANTLR3_COMMON_TREE_NODE_STREAM ctns);
-
-// Constructors
-//
-static void antlr3TreeNodeStreamFree (pANTLR3_TREE_NODE_STREAM tns);
-static void antlr3CommonTreeNodeStreamFree (pANTLR3_COMMON_TREE_NODE_STREAM ctns);
-
-ANTLR3_API pANTLR3_TREE_NODE_STREAM
-antlr3TreeNodeStreamNew()
-{
- pANTLR3_TREE_NODE_STREAM stream;
-
- // Memory for the interface structure
- //
- stream = (pANTLR3_TREE_NODE_STREAM) ANTLR3_CALLOC(1, sizeof(ANTLR3_TREE_NODE_STREAM));
-
- if (stream == NULL)
- {
- return NULL;
- }
-
- // Install basic API
- //
- stream->replaceChildren = replaceChildren;
- stream->free = antlr3TreeNodeStreamFree;
-
- return stream;
-}
-
-static void
-antlr3TreeNodeStreamFree(pANTLR3_TREE_NODE_STREAM stream)
-{
- ANTLR3_FREE(stream);
-}
-
-ANTLR3_API pANTLR3_COMMON_TREE_NODE_STREAM
-antlr3CommonTreeNodeStreamNewTree(pANTLR3_BASE_TREE tree, ANTLR3_UINT32 hint)
-{
- pANTLR3_COMMON_TREE_NODE_STREAM stream;
-
- stream = antlr3CommonTreeNodeStreamNew(tree->strFactory, hint);
-
- if (stream == NULL)
- {
- return NULL;
- }
- stream->root = tree;
-
- return stream;
-}
-
-ANTLR3_API pANTLR3_COMMON_TREE_NODE_STREAM
-antlr3CommonTreeNodeStreamNewStream(pANTLR3_COMMON_TREE_NODE_STREAM inStream)
-{
- pANTLR3_COMMON_TREE_NODE_STREAM stream;
-
- // Memory for the interface structure
- //
- stream = (pANTLR3_COMMON_TREE_NODE_STREAM) ANTLR3_CALLOC(1, sizeof(ANTLR3_COMMON_TREE_NODE_STREAM));
-
- if (stream == NULL)
- {
- return NULL;
- }
-
- // Copy in all the reusable parts of the originating stream and create new
- // pieces where necessary.
- //
-
- // String factory for tree walker
- //
- stream->stringFactory = inStream->stringFactory;
-
- // Create an adaptor for the common tree node stream
- //
- stream->adaptor = inStream->adaptor;
-
- // Create space for the tree node stream interface
- //
- stream->tnstream = antlr3TreeNodeStreamNew();
-
- if (stream->tnstream == NULL)
- {
- stream->free (stream);
-
- return NULL;
- }
-
- // Create space for the INT_STREAM interface
- //
- stream->tnstream->istream = antlr3IntStreamNew();
-
- if (stream->tnstream->istream == NULL)
- {
- stream->tnstream->free (stream->tnstream);
- stream->free (stream);
-
- return NULL;
- }
-
- // Install the common tree node stream API
- //
- stream->addNavigationNode = addNavigationNode;
- stream->hasUniqueNavigationNodes = hasUniqueNavigationNodes;
- stream->newDownNode = newDownNode;
- stream->newUpNode = newUpNode;
- stream->reset = reset;
- stream->push = push;
- stream->pop = pop;
- stream->getLookaheadSize = getLookaheadSize;
-
- stream->free = antlr3CommonTreeNodeStreamFree;
-
- // Install the tree node stream API
- //
- stream->tnstream->getTreeAdaptor = getTreeAdaptor;
- stream->tnstream->getTreeSource = getTreeSource;
- stream->tnstream->_LT = _LT;
- stream->tnstream->setUniqueNavigationNodes = setUniqueNavigationNodes;
- stream->tnstream->toString = toString;
- stream->tnstream->toStringSS = toStringSS;
- stream->tnstream->toStringWork = toStringWork;
- stream->tnstream->get = get;
-
- // Install INT_STREAM interface
- //
- stream->tnstream->istream->consume = consume;
- stream->tnstream->istream->index = tindex;
- stream->tnstream->istream->_LA = _LA;
- stream->tnstream->istream->mark = mark;
- stream->tnstream->istream->release = release;
- stream->tnstream->istream->rewind = rewindMark;
- stream->tnstream->istream->rewindLast = rewindLast;
- stream->tnstream->istream->seek = seek;
- stream->tnstream->istream->size = size;
-
- // Initialize data elements of INT stream
- //
- stream->tnstream->istream->type = ANTLR3_COMMONTREENODE;
- stream->tnstream->istream->super = (stream->tnstream);
-
- // Initialize data elements of TREE stream
- //
- stream->tnstream->ctns = stream;
-
- // Initialize data elements of the COMMON TREE NODE stream
- //
- stream->super = NULL;
- stream->uniqueNavigationNodes = ANTLR3_FALSE;
- stream->markers = NULL;
- stream->nodeStack = inStream->nodeStack;
-
- // Create the node list map
- //
- stream->nodes = antlr3VectorNew(DEFAULT_INITIAL_BUFFER_SIZE);
- stream->p = -1;
-
- // Install the navigation nodes
- //
-
- // Install the navigation nodes
- //
- antlr3SetCTAPI(&(stream->UP));
- antlr3SetCTAPI(&(stream->DOWN));
- antlr3SetCTAPI(&(stream->EOF_NODE));
- antlr3SetCTAPI(&(stream->INVALID_NODE));
-
- stream->UP.token = inStream->UP.token;
- inStream->UP.token->strFactory = stream->stringFactory;
- stream->DOWN.token = inStream->DOWN.token;
- inStream->DOWN.token->strFactory = stream->stringFactory;
- stream->EOF_NODE.token = inStream->EOF_NODE.token;
- inStream->EOF_NODE.token->strFactory = stream->stringFactory;
- stream->INVALID_NODE.token = inStream->INVALID_NODE.token;
- inStream->INVALID_NODE.token->strFactory= stream->stringFactory;
-
- // Reuse the root tree of the originating stream
- //
- stream->root = inStream->root;
-
- // Signal that this is a rewriting stream so we don't
- // free the originating tree. Anything that we rewrite or
- // duplicate here will be done through the adaptor or
- // the original tree factory.
- //
- stream->isRewriter = ANTLR3_TRUE;
- return stream;
-}
-
-ANTLR3_API pANTLR3_COMMON_TREE_NODE_STREAM
-antlr3CommonTreeNodeStreamNew(pANTLR3_STRING_FACTORY strFactory, ANTLR3_UINT32 hint)
-{
- pANTLR3_COMMON_TREE_NODE_STREAM stream;
- pANTLR3_COMMON_TOKEN token;
-
- // Memory for the interface structure
- //
- stream = (pANTLR3_COMMON_TREE_NODE_STREAM) ANTLR3_CALLOC(1, sizeof(ANTLR3_COMMON_TREE_NODE_STREAM));
-
- if (stream == NULL)
- {
- return NULL;
- }
-
- // String factory for tree walker
- //
- stream->stringFactory = strFactory;
-
- // Create an adaptor for the common tree node stream
- //
- stream->adaptor = ANTLR3_TREE_ADAPTORNew(strFactory);
-
- if (stream->adaptor == NULL)
- {
- stream->free(stream);
- return NULL;
- }
-
- // Create space for the tree node stream interface
- //
- stream->tnstream = antlr3TreeNodeStreamNew();
-
- if (stream->tnstream == NULL)
- {
- stream->adaptor->free (stream->adaptor);
- stream->free (stream);
-
- return NULL;
- }
-
- // Create space for the INT_STREAM interface
- //
- stream->tnstream->istream = antlr3IntStreamNew();
-
- if (stream->tnstream->istream == NULL)
- {
- stream->adaptor->free (stream->adaptor);
- stream->tnstream->free (stream->tnstream);
- stream->free (stream);
-
- return NULL;
- }
-
- // Install the common tree node stream API
- //
- stream->addNavigationNode = addNavigationNode;
- stream->hasUniqueNavigationNodes = hasUniqueNavigationNodes;
- stream->newDownNode = newDownNode;
- stream->newUpNode = newUpNode;
- stream->reset = reset;
- stream->push = push;
- stream->pop = pop;
-
- stream->free = antlr3CommonTreeNodeStreamFree;
-
- // Install the tree node stream API
- //
- stream->tnstream->getTreeAdaptor = getTreeAdaptor;
- stream->tnstream->getTreeSource = getTreeSource;
- stream->tnstream->_LT = _LT;
- stream->tnstream->setUniqueNavigationNodes = setUniqueNavigationNodes;
- stream->tnstream->toString = toString;
- stream->tnstream->toStringSS = toStringSS;
- stream->tnstream->toStringWork = toStringWork;
- stream->tnstream->get = get;
-
- // Install INT_STREAM interface
- //
- stream->tnstream->istream->consume = consume;
- stream->tnstream->istream->index = tindex;
- stream->tnstream->istream->_LA = _LA;
- stream->tnstream->istream->mark = mark;
- stream->tnstream->istream->release = release;
- stream->tnstream->istream->rewind = rewindMark;
- stream->tnstream->istream->rewindLast = rewindLast;
- stream->tnstream->istream->seek = seek;
- stream->tnstream->istream->size = size;
-
- // Initialize data elements of INT stream
- //
- stream->tnstream->istream->type = ANTLR3_COMMONTREENODE;
- stream->tnstream->istream->super = (stream->tnstream);
-
- // Initialize data elements of TREE stream
- //
- stream->tnstream->ctns = stream;
-
- // Initialize data elements of the COMMON TREE NODE stream
- //
- stream->super = NULL;
- stream->uniqueNavigationNodes = ANTLR3_FALSE;
- stream->markers = NULL;
- stream->nodeStack = antlr3StackNew(INITIAL_CALL_STACK_SIZE);
-
- // Create the node list map
- //
- if (hint == 0)
- {
- hint = DEFAULT_INITIAL_BUFFER_SIZE;
- }
- stream->nodes = antlr3VectorNew(hint);
- stream->p = -1;
-
- // Install the navigation nodes
- //
- antlr3SetCTAPI(&(stream->UP));
- antlr3SetCTAPI(&(stream->DOWN));
- antlr3SetCTAPI(&(stream->EOF_NODE));
- antlr3SetCTAPI(&(stream->INVALID_NODE));
-
- token = antlr3CommonTokenNew(ANTLR3_TOKEN_UP);
- token->strFactory = strFactory;
- token->textState = ANTLR3_TEXT_CHARP;
- token->tokText.chars = (pANTLR3_UCHAR)"UP";
- stream->UP.token = token;
-
- token = antlr3CommonTokenNew(ANTLR3_TOKEN_DOWN);
- token->strFactory = strFactory;
- token->textState = ANTLR3_TEXT_CHARP;
- token->tokText.chars = (pANTLR3_UCHAR)"DOWN";
- stream->DOWN.token = token;
-
- token = antlr3CommonTokenNew(ANTLR3_TOKEN_EOF);
- token->strFactory = strFactory;
- token->textState = ANTLR3_TEXT_CHARP;
- token->tokText.chars = (pANTLR3_UCHAR)"EOF";
- stream->EOF_NODE.token = token;
-
- token = antlr3CommonTokenNew(ANTLR3_TOKEN_INVALID);
- token->strFactory = strFactory;
- token->textState = ANTLR3_TEXT_CHARP;
- token->tokText.chars = (pANTLR3_UCHAR)"INVALID";
- stream->INVALID_NODE.token = token;
-
-
- return stream;
-}
-
-/// Free up any resources that belong to this common tree node stream.
-///
-static void antlr3CommonTreeNodeStreamFree (pANTLR3_COMMON_TREE_NODE_STREAM ctns)
-{
-
- // If this is a rewrting stream, then certain resources
- // belong to the originating node stream and we do not
- // free them here.
- //
- if (ctns->isRewriter != ANTLR3_TRUE)
- {
- ctns->adaptor ->free (ctns->adaptor);
-
- if (ctns->nodeStack != NULL)
- {
- ctns->nodeStack->free(ctns->nodeStack);
- }
-
- ANTLR3_FREE(ctns->INVALID_NODE.token);
- ANTLR3_FREE(ctns->EOF_NODE.token);
- ANTLR3_FREE(ctns->DOWN.token);
- ANTLR3_FREE(ctns->UP.token);
- }
-
- if (ctns->nodes != NULL)
- {
- ctns->nodes ->free (ctns->nodes);
- }
- ctns->tnstream->istream ->free (ctns->tnstream->istream);
- ctns->tnstream ->free (ctns->tnstream);
-
-
- ANTLR3_FREE(ctns);
-}
-
-// ------------------------------------------------------------------------------
-// Local helpers
-//
-
-/// Walk and fill the tree node buffer from the root tree
-///
-static void
-fillBufferRoot(pANTLR3_COMMON_TREE_NODE_STREAM ctns)
-{
- // Call the generic buffer routine with the root as the
- // argument
- //
- fillBuffer(ctns, ctns->root);
- ctns->p = 0; // Indicate we are at buffer start
-}
-
-/// Walk tree with depth-first-search and fill nodes buffer.
-/// Don't add in DOWN, UP nodes if the supplied tree is a list (t is isNilNode)
-// such as the root tree is.
-///
-static void
-fillBuffer(pANTLR3_COMMON_TREE_NODE_STREAM ctns, pANTLR3_BASE_TREE t)
-{
- ANTLR3_BOOLEAN nilNode;
- ANTLR3_UINT32 nCount;
- ANTLR3_UINT32 c;
-
- nilNode = ctns->adaptor->isNilNode(ctns->adaptor, t);
-
- // If the supplied node is not a nil (list) node then we
- // add in the node itself to the vector
- //
- if (nilNode == ANTLR3_FALSE)
- {
- ctns->nodes->add(ctns->nodes, t, NULL);
- }
-
- // Only add a DOWN node if the tree is not a nil tree and
- // the tree does have children.
- //
- nCount = t->getChildCount(t);
-
- if (nilNode == ANTLR3_FALSE && nCount>0)
- {
- ctns->addNavigationNode(ctns, ANTLR3_TOKEN_DOWN);
- }
-
- // We always add any children the tree contains, which is
- // a recursive call to this function, which will cause similar
- // recursion and implement a depth first addition
- //
- for (c = 0; c < nCount; c++)
- {
- fillBuffer(ctns, ctns->adaptor->getChild(ctns->adaptor, t, c));
- }
-
- // If the tree had children and was not a nil (list) node, then we
- // we need to add an UP node here to match the DOWN node
- //
- if (nilNode == ANTLR3_FALSE && nCount > 0)
- {
- ctns->addNavigationNode(ctns, ANTLR3_TOKEN_UP);
- }
-}
-
-
-// ------------------------------------------------------------------------------
-// Interface functions
-//
-
-/// Reset the input stream to the start of the input nodes.
-///
-static void
-reset (pANTLR3_COMMON_TREE_NODE_STREAM ctns)
-{
- if (ctns->p != -1)
- {
- ctns->p = 0;
- }
- ctns->tnstream->istream->lastMarker = 0;
-
-
- // Free and reset the node stack only if this is not
- // a rewriter, which is going to reuse the originating
- // node streams node stack
- //
- if (ctns->isRewriter != ANTLR3_TRUE)
- {
- if (ctns->nodeStack != NULL)
- {
- ctns->nodeStack->free(ctns->nodeStack);
- ctns->nodeStack = antlr3StackNew(INITIAL_CALL_STACK_SIZE);
- }
- }
-}
-
-
-static pANTLR3_BASE_TREE
-LB(pANTLR3_TREE_NODE_STREAM tns, ANTLR3_INT32 k)
-{
- if ( k==0)
- {
- return &(tns->ctns->INVALID_NODE.baseTree);
- }
-
- if ( (tns->ctns->p - k) < 0)
- {
- return &(tns->ctns->INVALID_NODE.baseTree);
- }
-
- return tns->ctns->nodes->get(tns->ctns->nodes, tns->ctns->p - k);
-}
-
-/// Get tree node at current input pointer + i ahead where i=1 is next node.
-/// i<0 indicates nodes in the past. So -1 is previous node and -2 is
-/// two nodes ago. LT(0) is undefined. For i>=n, return null.
-/// Return null for LT(0) and any index that results in an absolute address
-/// that is negative.
-///
-/// This is analogous to the _LT() method of the TokenStream, but this
-/// returns a tree node instead of a token. Makes code gen identical
-/// for both parser and tree grammars. :)
-///
-static pANTLR3_BASE_TREE
-_LT (pANTLR3_TREE_NODE_STREAM tns, ANTLR3_INT32 k)
-{
- if (tns->ctns->p == -1)
- {
- fillBufferRoot(tns->ctns);
- }
-
- if (k < 0)
- {
- return LB(tns, -k);
- }
- else if (k == 0)
- {
- return &(tns->ctns->INVALID_NODE.baseTree);
- }
-
- // k was a legitimate request,
- //
- if (( tns->ctns->p + k - 1) >= (ANTLR3_INT32)(tns->ctns->nodes->count))
- {
- return &(tns->ctns->EOF_NODE.baseTree);
- }
-
- return tns->ctns->nodes->get(tns->ctns->nodes, tns->ctns->p + k - 1);
-}
-
-/// Where is this stream pulling nodes from? This is not the name, but
-/// the object that provides node objects.
-///
-static pANTLR3_BASE_TREE
-getTreeSource (pANTLR3_TREE_NODE_STREAM tns)
-{
- return tns->ctns->root;
-}
-
-/// Consume the next node from the input stream
-///
-static void
-consume (pANTLR3_INT_STREAM is)
-{
- pANTLR3_TREE_NODE_STREAM tns;
- pANTLR3_COMMON_TREE_NODE_STREAM ctns;
-
- tns = (pANTLR3_TREE_NODE_STREAM)(is->super);
- ctns = tns->ctns;
-
- if (ctns->p == -1)
- {
- fillBufferRoot(ctns);
- }
- ctns->p++;
-}
-
-static ANTLR3_UINT32
-_LA (pANTLR3_INT_STREAM is, ANTLR3_INT32 i)
-{
- pANTLR3_TREE_NODE_STREAM tns;
- pANTLR3_BASE_TREE t;
-
- tns = (pANTLR3_TREE_NODE_STREAM)(is->super);
-
- // Ask LT for the 'token' at that position
- //
- t = tns->_LT(tns, i);
-
- if (t == NULL)
- {
- return ANTLR3_TOKEN_INVALID;
- }
-
- // Token node was there so return the type of it
- //
- return t->getType(t);
-}
-
-/// Mark the state of the input stream so that we can come back to it
-/// after a syntactic predicate and so on.
-///
-static ANTLR3_MARKER
-mark (pANTLR3_INT_STREAM is)
-{
- pANTLR3_TREE_NODE_STREAM tns;
- pANTLR3_COMMON_TREE_NODE_STREAM ctns;
-
- tns = (pANTLR3_TREE_NODE_STREAM)(is->super);
- ctns = tns->ctns;
-
- if (tns->ctns->p == -1)
- {
- fillBufferRoot(tns->ctns);
- }
-
- // Return the current mark point
- //
- ctns->tnstream->istream->lastMarker = ctns->tnstream->istream->index(ctns->tnstream->istream);
-
- return ctns->tnstream->istream->lastMarker;
-}
-
-static void
-release (pANTLR3_INT_STREAM is, ANTLR3_MARKER marker)
-{
-}
-
-/// Rewind the current state of the tree walk to the state it
-/// was in when mark() was called and it returned marker. Also,
-/// wipe out the lookahead which will force reloading a few nodes
-/// but it is better than making a copy of the lookahead buffer
-/// upon mark().
-///
-static void
-rewindMark (pANTLR3_INT_STREAM is, ANTLR3_MARKER marker)
-{
- is->seek(is, marker);
-}
-
-static void
-rewindLast (pANTLR3_INT_STREAM is)
-{
- is->seek(is, is->lastMarker);
-}
-
-/// consume() ahead until we hit index. Can't just jump ahead--must
-/// spit out the navigation nodes.
-///
-static void
-seek (pANTLR3_INT_STREAM is, ANTLR3_MARKER index)
-{
- pANTLR3_TREE_NODE_STREAM tns;
- pANTLR3_COMMON_TREE_NODE_STREAM ctns;
-
- tns = (pANTLR3_TREE_NODE_STREAM)(is->super);
- ctns = tns->ctns;
-
- ctns->p = ANTLR3_UINT32_CAST(index);
-}
-
-static ANTLR3_MARKER
-tindex (pANTLR3_INT_STREAM is)
-{
- pANTLR3_TREE_NODE_STREAM tns;
- pANTLR3_COMMON_TREE_NODE_STREAM ctns;
-
- tns = (pANTLR3_TREE_NODE_STREAM)(is->super);
- ctns = tns->ctns;
-
- return (ANTLR3_MARKER)(ctns->p);
-}
-
-/// Expensive to compute the size of the whole tree while parsing.
-/// This method only returns how much input has been seen so far. So
-/// after parsing it returns true size.
-///
-static ANTLR3_UINT32
-size (pANTLR3_INT_STREAM is)
-{
- pANTLR3_TREE_NODE_STREAM tns;
- pANTLR3_COMMON_TREE_NODE_STREAM ctns;
-
- tns = (pANTLR3_TREE_NODE_STREAM)(is->super);
- ctns = tns->ctns;
-
- if (ctns->p == -1)
- {
- fillBufferRoot(ctns);
- }
-
- return ctns->nodes->size(ctns->nodes);
-}
-
-/// As we flatten the tree, we use UP, DOWN nodes to represent
-/// the tree structure. When debugging we need unique nodes
-/// so instantiate new ones when uniqueNavigationNodes is true.
-///
-static void
-addNavigationNode (pANTLR3_COMMON_TREE_NODE_STREAM ctns, ANTLR3_UINT32 ttype)
-{
- pANTLR3_BASE_TREE node;
-
- node = NULL;
-
- if (ttype == ANTLR3_TOKEN_DOWN)
- {
- if (ctns->hasUniqueNavigationNodes(ctns) == ANTLR3_TRUE)
- {
- node = ctns->newDownNode(ctns);
- }
- else
- {
- node = &(ctns->DOWN.baseTree);
- }
- }
- else
- {
- if (ctns->hasUniqueNavigationNodes(ctns) == ANTLR3_TRUE)
- {
- node = ctns->newUpNode(ctns);
- }
- else
- {
- node = &(ctns->UP.baseTree);
- }
- }
-
- // Now add the node we decided upon.
- //
- ctns->nodes->add(ctns->nodes, node, NULL);
-}
-
-
-static pANTLR3_BASE_TREE_ADAPTOR
-getTreeAdaptor (pANTLR3_TREE_NODE_STREAM tns)
-{
- return tns->ctns->adaptor;
-}
-
-static ANTLR3_BOOLEAN
-hasUniqueNavigationNodes (pANTLR3_COMMON_TREE_NODE_STREAM ctns)
-{
- return ctns->uniqueNavigationNodes;
-}
-
-static void
-setUniqueNavigationNodes (pANTLR3_TREE_NODE_STREAM tns, ANTLR3_BOOLEAN uniqueNavigationNodes)
-{
- tns->ctns->uniqueNavigationNodes = uniqueNavigationNodes;
-}
-
-
-/// Print out the entire tree including DOWN/UP nodes. Uses
-/// a recursive walk. Mostly useful for testing as it yields
-/// the token types not text.
-///
-static pANTLR3_STRING
-toString (pANTLR3_TREE_NODE_STREAM tns)
-{
-
- return tns->toStringSS(tns, tns->ctns->root, NULL);
-}
-
-static pANTLR3_STRING
-toStringSS (pANTLR3_TREE_NODE_STREAM tns, pANTLR3_BASE_TREE start, pANTLR3_BASE_TREE stop)
-{
- pANTLR3_STRING buf;
-
- buf = tns->ctns->stringFactory->newRaw(tns->ctns->stringFactory);
-
- tns->toStringWork(tns, start, stop, buf);
-
- return buf;
-}
-
-static void
-toStringWork (pANTLR3_TREE_NODE_STREAM tns, pANTLR3_BASE_TREE p, pANTLR3_BASE_TREE stop, pANTLR3_STRING buf)
-{
-
- ANTLR3_UINT32 n;
- ANTLR3_UINT32 c;
-
- if (!p->isNilNode(p) )
- {
- pANTLR3_STRING text;
-
- text = p->toString(p);
-
- if (text == NULL)
- {
- text = tns->ctns->stringFactory->newRaw(tns->ctns->stringFactory);
-
- text->addc (text, ' ');
- text->addi (text, p->getType(p));
- }
-
- buf->appendS(buf, text);
- }
-
- if (p == stop)
- {
- return; /* Finished */
- }
-
- n = p->getChildCount(p);
-
- if (n > 0 && ! p->isNilNode(p) )
- {
- buf->addc (buf, ' ');
- buf->addi (buf, ANTLR3_TOKEN_DOWN);
- }
-
- for (c = 0; c<n ; c++)
- {
- pANTLR3_BASE_TREE child;
-
- child = p->getChild(p, c);
- tns->toStringWork(tns, child, stop, buf);
- }
-
- if (n > 0 && ! p->isNilNode(p) )
- {
- buf->addc (buf, ' ');
- buf->addi (buf, ANTLR3_TOKEN_UP);
- }
-}
-
-static ANTLR3_UINT32
-getLookaheadSize (pANTLR3_COMMON_TREE_NODE_STREAM ctns)
-{
- return ctns->tail < ctns->head
- ? (ctns->lookAheadLength - ctns->head + ctns->tail)
- : (ctns->tail - ctns->head);
-}
-
-static pANTLR3_BASE_TREE
-newDownNode (pANTLR3_COMMON_TREE_NODE_STREAM ctns)
-{
- pANTLR3_COMMON_TREE dNode;
- pANTLR3_COMMON_TOKEN token;
-
- token = antlr3CommonTokenNew(ANTLR3_TOKEN_DOWN);
- token->textState = ANTLR3_TEXT_CHARP;
- token->tokText.chars = (pANTLR3_UCHAR)"DOWN";
- dNode = antlr3CommonTreeNewFromToken(token);
-
- return &(dNode->baseTree);
-}
-
-static pANTLR3_BASE_TREE
-newUpNode (pANTLR3_COMMON_TREE_NODE_STREAM ctns)
-{
- pANTLR3_COMMON_TREE uNode;
- pANTLR3_COMMON_TOKEN token;
-
- token = antlr3CommonTokenNew(ANTLR3_TOKEN_UP);
- token->textState = ANTLR3_TEXT_CHARP;
- token->tokText.chars = (pANTLR3_UCHAR)"UP";
- uNode = antlr3CommonTreeNewFromToken(token);
-
- return &(uNode->baseTree);
-}
-
-/// Replace from start to stop child index of parent with t, which might
-/// be a list. Number of children may be different
-/// after this call. The stream is notified because it is walking the
-/// tree and might need to know you are monkey-ing with the underlying
-/// tree. Also, it might be able to modify the node stream to avoid
-/// re-streaming for future phases.
-///
-/// If parent is null, don't do anything; must be at root of overall tree.
-/// Can't replace whatever points to the parent externally. Do nothing.
-///
-static void
-replaceChildren (pANTLR3_TREE_NODE_STREAM tns, pANTLR3_BASE_TREE parent, ANTLR3_INT32 startChildIndex, ANTLR3_INT32 stopChildIndex, pANTLR3_BASE_TREE t)
-{
- if (parent != NULL)
- {
- pANTLR3_BASE_TREE_ADAPTOR adaptor;
- pANTLR3_COMMON_TREE_ADAPTOR cta;
-
- adaptor = tns->getTreeAdaptor(tns);
- cta = (pANTLR3_COMMON_TREE_ADAPTOR)(adaptor->super);
-
- adaptor->replaceChildren(adaptor, parent, startChildIndex, stopChildIndex, t);
- }
-}
-
-static pANTLR3_BASE_TREE
-get (pANTLR3_TREE_NODE_STREAM tns, ANTLR3_INT32 k)
-{
- if (tns->ctns->p == -1)
- {
- fillBufferRoot(tns->ctns);
- }
-
- return tns->ctns->nodes->get(tns->ctns->nodes, k);
-}
-
-static void
-push (pANTLR3_COMMON_TREE_NODE_STREAM ctns, ANTLR3_INT32 index)
-{
- ctns->nodeStack->push(ctns->nodeStack, ANTLR3_FUNC_PTR(ctns->p), NULL); // Save current index
- ctns->tnstream->istream->seek(ctns->tnstream->istream, index);
-}
-
-static ANTLR3_INT32
-pop (pANTLR3_COMMON_TREE_NODE_STREAM ctns)
-{
- ANTLR3_INT32 retVal;
-
- retVal = ANTLR3_UINT32_CAST(ctns->nodeStack->pop(ctns->nodeStack));
- ctns->tnstream->istream->seek(ctns->tnstream->istream, retVal);
- return retVal;
-}