1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** \file 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Implementation of the tree parser and overrides for the base recognizer 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD licence"] 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.temporal-wave.com 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.linkedin.com/in/jimidle 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved. 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met: 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer. 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer in the 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// documentation and/or other materials provided with the distribution. 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// derived from this software without specific prior written permission. 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <antlr3treeparser.h> 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* BASE Recognizer overrides 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void mismatch (pANTLR3_BASE_RECOGNIZER recognizer, ANTLR3_UINT32 ttype, pANTLR3_BITSET_LIST follow); 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Tree parser API 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setTreeNodeStream (pANTLR3_TREE_PARSER parser, pANTLR3_COMMON_TREE_NODE_STREAM input); 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_COMMON_TREE_NODE_STREAM 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver getTreeNodeStream (pANTLR3_TREE_PARSER parser); 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void freeParser (pANTLR3_TREE_PARSER parser); 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void * getCurrentInputSymbol (pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_INT_STREAM istream); 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void * getMissingSymbol (pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_INT_STREAM istream, pANTLR3_EXCEPTION e, 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 expectedTokenType, pANTLR3_BITSET_LIST follow); 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 51324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API pANTLR3_TREE_PARSER 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3TreeParserNewStream(ANTLR3_UINT32 sizeHint, pANTLR3_COMMON_TREE_NODE_STREAM ctnstream, pANTLR3_RECOGNIZER_SHARED_STATE state) 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_TREE_PARSER parser; 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /** Allocate tree parser memory 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser =(pANTLR3_TREE_PARSER) ANTLR3_MALLOC(sizeof(ANTLR3_TREE_PARSER)); 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (parser == NULL) 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Create and install a base recognizer which does most of the work for us 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser->rec = antlr3BaseRecognizerNew(ANTLR3_TYPE_PARSER, sizeHint, state); 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (parser->rec == NULL) 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser->free(parser); 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Ensure we can track back to the tree parser super structure 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * from the base recognizer structure 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser->rec->super = parser; 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser->rec->type = ANTLR3_TYPE_TREE_PARSER; 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Install our base recognizer overrides 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser->rec->mismatch = mismatch; 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser->rec->exConstruct = antlr3MTNExceptionNew; 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser->rec->getCurrentInputSymbol = getCurrentInputSymbol; 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser->rec->getMissingSymbol = getMissingSymbol; 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Install tree parser API 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser->getTreeNodeStream = getTreeNodeStream; 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser->setTreeNodeStream = setTreeNodeStream; 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser->free = freeParser; 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Install the tree node stream 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser->setTreeNodeStream(parser, ctnstream); 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return parser; 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \brief 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Creates a new Mismatched Tree Nde Exception and inserts in the recognizer 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * exception stack. 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * \param recognizer 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Context pointer for this recognizer 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 110324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API void 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3MTNExceptionNew(pANTLR3_BASE_RECOGNIZER recognizer) 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Create a basic recognition exception structure 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver antlr3RecognitionExceptionNew(recognizer); 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Now update it to indicate this is a Mismatched token exception 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver recognizer->state->exception->name = ANTLR3_MISMATCHED_TREE_NODE_NAME; 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver recognizer->state->exception->type = ANTLR3_MISMATCHED_TREE_NODE_EXCEPTION; 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 127324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfreeParser (pANTLR3_TREE_PARSER parser) 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (parser->rec != NULL) 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // This may have ben a delegate or delegator parser, in which case the 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // state may already have been freed (and set to NULL therefore) 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // so we ignore the state if we don't have it. 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (parser->rec->state != NULL) 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (parser->rec->state->following != NULL) 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser->rec->state->following->free(parser->rec->state->following); 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser->rec->state->following = NULL; 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser->rec->free(parser->rec); 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser->rec = NULL; 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FREE(parser); 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Set the input stream and reset the parser 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 153324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetTreeNodeStream (pANTLR3_TREE_PARSER parser, pANTLR3_COMMON_TREE_NODE_STREAM input) 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser->ctnstream = input; 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser->rec->reset (parser->rec); 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parser->ctnstream->reset (parser->ctnstream); 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Return a pointer to the input stream 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_COMMON_TREE_NODE_STREAM 163324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetTreeNodeStream (pANTLR3_TREE_PARSER parser) 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return parser->ctnstream; 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Override for standard base recognizer mismatch function 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * as we have DOWN/UP nodes in the stream that have no line info, 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * plus we want to alter the exception type. 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvermismatch (pANTLR3_BASE_RECOGNIZER recognizer, ANTLR3_UINT32 ttype, pANTLR3_BITSET_LIST follow) 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver recognizer->exConstruct(recognizer); 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver recognizer->recoverFromMismatchedToken(recognizer, ttype, follow); 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef ANTLR3_WINDOWS 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning (push) 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning (disable : 4100) 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Default implementation is for parser and assumes a token stream as supplied by the runtime. 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// You MAY need override this function if the standard TOKEN_STREAM is not what you are using. 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void * 189324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetCurrentInputSymbol (pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_INT_STREAM istream) 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_TREE_NODE_STREAM tns; 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_COMMON_TREE_NODE_STREAM ctns; 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tns = (pANTLR3_TREE_NODE_STREAM)(istream->super); 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctns = tns->ctns; 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return tns->_LT(tns, 1); 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Default implementation is for parser and assumes a token stream as supplied by the runtime. 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// You MAY need override this function if the standard BASE_TREE is not what you are using. 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void * 204324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetMissingSymbol (pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_INT_STREAM istream, pANTLR3_EXCEPTION e, 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 expectedTokenType, pANTLR3_BITSET_LIST follow) 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_TREE_NODE_STREAM tns; 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_COMMON_TREE_NODE_STREAM ctns; 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE node; 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE current; 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_COMMON_TOKEN token; 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_STRING text; 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_INT32 i; 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Dereference the standard pointers 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tns = (pANTLR3_TREE_NODE_STREAM)(istream->super); 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ctns = tns->ctns; 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Create a new empty node, by stealing the current one, or the previous one if the current one is EOF 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver current = tns->_LT(tns, 1); 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i = -1; 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (current == &ctns->EOF_NODE.baseTree) 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver current = tns->_LT(tns, -1); 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver i--; 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while (((pANTLR3_COMMON_TREE)(current->super))->factory == NULL) 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver current = tns->_LT(tns, i--); 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver node = current->dupNode(current); 236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Find the newly dupicated token 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token = node->getToken(node); 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Create the token text that shows it has been inserted 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver token->setText8 (token, (pANTLR3_UINT8)"<missing "); 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver text = token->getText (token); 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver text->append8 (text, (const char *)recognizer->state->tokenNames[expectedTokenType]); 246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver text->append8 (text, (const char *)">"); 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Finally return the pointer to our new node 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return node; 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef ANTLR3_WINDOWS 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning (pop) 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 256