static void setCharStream (pANTLR3_LEXER lexer, pANTLR3_INPUT_STREAM input) { /* Install the input interface */ lexer->input = input; /* We may need a token factory for the lexer; we don't destroy any existing factory * until the lexer is destroyed, as people may still be using the tokens it produced. * TODO: Later I will provide a dup() method for a token so that it can extract itself * out of the factory. */ if (lexer->rec->state->tokFactory == NULL) { lexer->rec->state->tokFactory = antlr3TokenFactoryNew(input); } else { /* When the input stream is being changed on the fly, rather than * at the start of a new lexer, then we must tell the tokenFactory * which input stream to adorn the tokens with so that when they * are asked to provide their original input strings they can * do so from the correct text stream. */ lexer->rec->state->tokFactory->setInputStream(lexer->rec->state->tokFactory, input); } /* Propagate the string factory so that we preserve the encoding form from * the input stream. */ if (lexer->rec->state->tokSource->strFactory == NULL) { lexer->rec->state->tokSource->strFactory = input->strFactory; // Set the newly acquired string factory up for our pre-made tokens // for EOF. // if (lexer->rec->state->tokSource->eofToken.strFactory == NULL) { lexer->rec->state->tokSource->eofToken.strFactory = input->strFactory; } } /* This is a lexer, install the appropriate exception creator */ lexer->rec->exConstruct = antlr3RecognitionExceptionNew; /* Set the current token to nothing */ lexer->rec->state->token = NULL; lexer->rec->state->text = NULL; lexer->rec->state->tokenStartCharIndex = -1; /* Copy the name of the char stream to the token source */ lexer->rec->state->tokSource->fileName = input->fileName; }
/** Create a new tree adaptor. Note that despite the fact that this is * creating a new COMMON_TREE adaptor, we return the address of the * BASE_TREE interface, as should any other adaptor that wishes to be * used as the tree element of a tree parse/build. It needs to be given the * address of a valid string factory as we do not know what the originating * input stream encoding type was. This way we can rely on just using * the original input stream's string factory or one of the correct type * which the user supplies us. */ ANTLR3_API pANTLR3_BASE_TREE_ADAPTOR ANTLR3_TREE_ADAPTORNew(pANTLR3_STRING_FACTORY strFactory) { pANTLR3_COMMON_TREE_ADAPTOR cta; // First job is to create the memory we need for the tree adaptor interface. // cta = (pANTLR3_COMMON_TREE_ADAPTOR) ANTLR3_MALLOC((size_t)(sizeof(ANTLR3_COMMON_TREE_ADAPTOR))); if (cta == NULL) { return NULL; } // Memory is initialized, so initialize the base tree adaptor // antlr3BaseTreeAdaptorInit(&(cta->baseAdaptor), NULL); // Install our interface overrides. // cta->baseAdaptor.dupNode = (void * (*) (pANTLR3_BASE_TREE_ADAPTOR, void *)) dupNode; cta->baseAdaptor.create = (void * (*) (pANTLR3_BASE_TREE_ADAPTOR, pANTLR3_COMMON_TOKEN)) create; cta->baseAdaptor.createToken = createToken; cta->baseAdaptor.createTokenFromToken = createTokenFromToken; cta->baseAdaptor.setTokenBoundaries = (void (*) (pANTLR3_BASE_TREE_ADAPTOR, void *, pANTLR3_COMMON_TOKEN, pANTLR3_COMMON_TOKEN)) setTokenBoundaries; cta->baseAdaptor.getTokenStartIndex = (ANTLR3_MARKER (*) (pANTLR3_BASE_TREE_ADAPTOR, void *)) getTokenStartIndex; cta->baseAdaptor.getTokenStopIndex = (ANTLR3_MARKER (*) (pANTLR3_BASE_TREE_ADAPTOR, void *)) getTokenStopIndex; cta->baseAdaptor.getText = (pANTLR3_STRING (*) (pANTLR3_BASE_TREE_ADAPTOR, void *)) getText; cta->baseAdaptor.getType = (ANTLR3_UINT32 (*) (pANTLR3_BASE_TREE_ADAPTOR, void *)) getType; cta->baseAdaptor.getChild = (void * (*) (pANTLR3_BASE_TREE_ADAPTOR, void *, ANTLR3_UINT32)) getChild; cta->baseAdaptor.setChild = (void (*) (pANTLR3_BASE_TREE_ADAPTOR, void *, ANTLR3_UINT32, void *)) setChild; cta->baseAdaptor.deleteChild = (void (*) (pANTLR3_BASE_TREE_ADAPTOR, void *, ANTLR3_UINT32)) deleteChild; cta->baseAdaptor.getChildCount = (ANTLR3_UINT32 (*) (pANTLR3_BASE_TREE_ADAPTOR, void *)) getChildCount; cta->baseAdaptor.free = (void (*) (pANTLR3_BASE_TREE_ADAPTOR)) ctaFree; cta->baseAdaptor.setDebugEventListener = setDebugEventListener; cta->baseAdaptor.replaceChildren = (void (*) (pANTLR3_BASE_TREE_ADAPTOR, void *, ANTLR3_INT32, ANTLR3_INT32, void *)) replaceChildren; cta->baseAdaptor.errorNode = (void * (*) (pANTLR3_BASE_TREE_ADAPTOR, pANTLR3_TOKEN_STREAM, pANTLR3_COMMON_TOKEN, pANTLR3_COMMON_TOKEN, pANTLR3_EXCEPTION)) errorNode; // Install the super class pointer // cta->baseAdaptor.super = cta; // Install a tree factory for creating new tree nodes // cta->arboretum = antlr3ArboretumNew(strFactory); // Install a token factory for imaginary tokens, these imaginary // tokens do not require access to the input stream so we can // dummy the creation of it. // cta->baseAdaptor.tokenFactory = antlr3TokenFactoryNew(NULL); // Allow the base tree adaptor to share the tree factory's string factory. // cta->baseAdaptor.strFactory = strFactory; // Return the address of the base adaptor interface. // return &(cta->baseAdaptor); }