summaryrefslogtreecommitdiff
path: root/impl/antlr/libantlr3c-3.4/src/antlr3lexer.c
diff options
context:
space:
mode:
Diffstat (limited to 'impl/antlr/libantlr3c-3.4/src/antlr3lexer.c')
-rw-r--r--impl/antlr/libantlr3c-3.4/src/antlr3lexer.c904
1 files changed, 0 insertions, 904 deletions
diff --git a/impl/antlr/libantlr3c-3.4/src/antlr3lexer.c b/impl/antlr/libantlr3c-3.4/src/antlr3lexer.c
deleted file mode 100644
index d981ab7..0000000
--- a/impl/antlr/libantlr3c-3.4/src/antlr3lexer.c
+++ /dev/null
@@ -1,904 +0,0 @@
-/** \file
- *
- * Base implementation of an antlr 3 lexer.
- *
- * An ANTLR3 lexer implements a base recongizer, a token source and
- * a lexer interface. It constructs a base recognizer with default
- * functions, then overrides any of these that are parser specific (usual
- * default implementation of base recognizer.
- */
-
-// [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 <antlr3lexer.h>
-
-static void mTokens (pANTLR3_LEXER lexer);
-static void setCharStream (pANTLR3_LEXER lexer, pANTLR3_INPUT_STREAM input);
-static void pushCharStream (pANTLR3_LEXER lexer, pANTLR3_INPUT_STREAM input);
-static void popCharStream (pANTLR3_LEXER lexer);
-
-static void emitNew (pANTLR3_LEXER lexer, pANTLR3_COMMON_TOKEN token);
-static pANTLR3_COMMON_TOKEN emit (pANTLR3_LEXER lexer);
-static ANTLR3_BOOLEAN matchs (pANTLR3_LEXER lexer, ANTLR3_UCHAR * string);
-static ANTLR3_BOOLEAN matchc (pANTLR3_LEXER lexer, ANTLR3_UCHAR c);
-static ANTLR3_BOOLEAN matchRange (pANTLR3_LEXER lexer, ANTLR3_UCHAR low, ANTLR3_UCHAR high);
-static void matchAny (pANTLR3_LEXER lexer);
-static void recover (pANTLR3_LEXER lexer);
-static ANTLR3_UINT32 getLine (pANTLR3_LEXER lexer);
-static ANTLR3_MARKER getCharIndex (pANTLR3_LEXER lexer);
-static ANTLR3_UINT32 getCharPositionInLine (pANTLR3_LEXER lexer);
-static pANTLR3_STRING getText (pANTLR3_LEXER lexer);
-static pANTLR3_COMMON_TOKEN nextToken (pANTLR3_TOKEN_SOURCE toksource);
-
-static void displayRecognitionError (pANTLR3_BASE_RECOGNIZER rec, pANTLR3_UINT8 * tokenNames);
-static void reportError (pANTLR3_BASE_RECOGNIZER rec);
-static void * getCurrentInputSymbol (pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_INT_STREAM istream);
-static void * getMissingSymbol (pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_INT_STREAM istream, pANTLR3_EXCEPTION e,
- ANTLR3_UINT32 expectedTokenType, pANTLR3_BITSET_LIST follow);
-
-static void reset (pANTLR3_BASE_RECOGNIZER rec);
-
-static void freeLexer (pANTLR3_LEXER lexer);
-
-
-ANTLR3_API pANTLR3_LEXER
-antlr3LexerNew(ANTLR3_UINT32 sizeHint, pANTLR3_RECOGNIZER_SHARED_STATE state)
-{
- pANTLR3_LEXER lexer;
- pANTLR3_COMMON_TOKEN specialT;
-
- /* Allocate memory
- */
- lexer = (pANTLR3_LEXER) ANTLR3_MALLOC(sizeof(ANTLR3_LEXER));
-
- if (lexer == NULL)
- {
- return NULL;
- }
-
- /* Now we need to create the base recognizer
- */
- lexer->rec = antlr3BaseRecognizerNew(ANTLR3_TYPE_LEXER, sizeHint, state);
-
- if (lexer->rec == NULL)
- {
- lexer->free(lexer);
- return NULL;
- }
- lexer->rec->super = lexer;
-
- lexer->rec->displayRecognitionError = displayRecognitionError;
- lexer->rec->reportError = reportError;
- lexer->rec->reset = reset;
- lexer->rec->getCurrentInputSymbol = getCurrentInputSymbol;
- lexer->rec->getMissingSymbol = getMissingSymbol;
-
- /* Now install the token source interface
- */
- if (lexer->rec->state->tokSource == NULL)
- {
- lexer->rec->state->tokSource = (pANTLR3_TOKEN_SOURCE)ANTLR3_CALLOC(1, sizeof(ANTLR3_TOKEN_SOURCE));
-
- if (lexer->rec->state->tokSource == NULL)
- {
- lexer->rec->free(lexer->rec);
- lexer->free(lexer);
-
- return NULL;
- }
- lexer->rec->state->tokSource->super = lexer;
-
- /* Install the default nextToken() method, which may be overridden
- * by generated code, or by anything else in fact.
- */
- lexer->rec->state->tokSource->nextToken = nextToken;
- lexer->rec->state->tokSource->strFactory = NULL;
-
- lexer->rec->state->tokFactory = NULL;
- }
-
- /* Install the lexer API
- */
- lexer->setCharStream = setCharStream;
- lexer->mTokens = (void (*)(void *))(mTokens);
- lexer->setCharStream = setCharStream;
- lexer->pushCharStream = pushCharStream;
- lexer->popCharStream = popCharStream;
- lexer->emit = emit;
- lexer->emitNew = emitNew;
- lexer->matchs = matchs;
- lexer->matchc = matchc;
- lexer->matchRange = matchRange;
- lexer->matchAny = matchAny;
- lexer->recover = recover;
- lexer->getLine = getLine;
- lexer->getCharIndex = getCharIndex;
- lexer->getCharPositionInLine = getCharPositionInLine;
- lexer->getText = getText;
- lexer->free = freeLexer;
-
- /* Initialise the eof token
- */
- specialT = &(lexer->rec->state->tokSource->eofToken);
- antlr3SetTokenAPI (specialT);
- specialT->setType (specialT, ANTLR3_TOKEN_EOF);
- specialT->factoryMade = ANTLR3_TRUE; // Prevent things trying to free() it
- specialT->strFactory = NULL;
- specialT->textState = ANTLR3_TEXT_NONE;
- specialT->custom = NULL;
- specialT->user1 = 0;
- specialT->user2 = 0;
- specialT->user3 = 0;
-
- // Initialize the skip token.
- //
- specialT = &(lexer->rec->state->tokSource->skipToken);
- antlr3SetTokenAPI (specialT);
- specialT->setType (specialT, ANTLR3_TOKEN_INVALID);
- specialT->factoryMade = ANTLR3_TRUE; // Prevent things trying to free() it
- specialT->strFactory = NULL;
- specialT->custom = NULL;
- specialT->user1 = 0;
- specialT->user2 = 0;
- specialT->user3 = 0;
- return lexer;
-}
-
-static void
-reset (pANTLR3_BASE_RECOGNIZER rec)
-{
- pANTLR3_LEXER lexer;
-
- lexer = rec->super;
-
- lexer->rec->state->token = NULL;
- lexer->rec->state->type = ANTLR3_TOKEN_INVALID;
- lexer->rec->state->channel = ANTLR3_TOKEN_DEFAULT_CHANNEL;
- lexer->rec->state->tokenStartCharIndex = -1;
- lexer->rec->state->tokenStartCharPositionInLine = -1;
- lexer->rec->state->tokenStartLine = -1;
-
- lexer->rec->state->text = NULL;
-
- // OK - that's all hunky dory, but we may well have had
- // a token factory that needs a reset. Do that here
- //
- if (lexer->rec->state->tokFactory != NULL)
- {
- lexer->rec->state->tokFactory->reset(lexer->rec->state->tokFactory);
- }
-}
-
-///
-/// \brief
-/// Returns the next available token from the current input stream.
-///
-/// \param toksource
-/// Points to the implementation of a token source. The lexer is
-/// addressed by the super structure pointer.
-///
-/// \returns
-/// The next token in the current input stream or the EOF token
-/// if there are no more tokens.
-///
-/// \remarks
-/// Write remarks for nextToken here.
-///
-/// \see nextToken
-///
-ANTLR3_INLINE static pANTLR3_COMMON_TOKEN
-nextTokenStr (pANTLR3_TOKEN_SOURCE toksource)
-{
- pANTLR3_LEXER lexer;
- pANTLR3_RECOGNIZER_SHARED_STATE state;
- pANTLR3_INPUT_STREAM input;
- pANTLR3_INT_STREAM istream;
-
- lexer = (pANTLR3_LEXER)(toksource->super);
- state = lexer->rec->state;
- input = lexer->input;
- istream = input->istream;
-
- /// Loop until we get a non skipped token or EOF
- ///
- for (;;)
- {
- // Get rid of any previous token (token factory takes care of
- // any de-allocation when this token is finally used up.
- //
- state->token = NULL;
- state->error = ANTLR3_FALSE; // Start out without an exception
- state->failed = ANTLR3_FALSE;
-
- // Now call the matching rules and see if we can generate a new token
- //
- for (;;)
- {
- // Record the start of the token in our input stream.
- //
- state->channel = ANTLR3_TOKEN_DEFAULT_CHANNEL;
- state->tokenStartCharIndex = (ANTLR3_MARKER)(((pANTLR3_UINT8)input->nextChar));
- state->tokenStartCharPositionInLine = input->charPositionInLine;
- state->tokenStartLine = input->line;
- state->text = NULL;
- state->custom = NULL;
- state->user1 = 0;
- state->user2 = 0;
- state->user3 = 0;
-
- if (istream->_LA(istream, 1) == ANTLR3_CHARSTREAM_EOF)
- {
- // Reached the end of the current stream, nothing more to do if this is
- // the last in the stack.
- //
- pANTLR3_COMMON_TOKEN teof = &(toksource->eofToken);
-
- teof->setStartIndex (teof, lexer->getCharIndex(lexer));
- teof->setStopIndex (teof, lexer->getCharIndex(lexer));
- teof->setLine (teof, lexer->getLine(lexer));
- teof->factoryMade = ANTLR3_TRUE; // This isn't really manufactured but it stops things from trying to free it
- return teof;
- }
-
- state->token = NULL;
- state->error = ANTLR3_FALSE; // Start out without an exception
- state->failed = ANTLR3_FALSE;
-
- // Call the generated lexer, see if it can get a new token together.
- //
- lexer->mTokens(lexer->ctx);
-
- if (state->error == ANTLR3_TRUE)
- {
- // Recognition exception, report it and try to recover.
- //
- state->failed = ANTLR3_TRUE;
- lexer->rec->reportError(lexer->rec);
- lexer->recover(lexer);
- }
- else
- {
- if (state->token == NULL)
- {
- // Emit the real token, which adds it in to the token stream basically
- //
- emit(lexer);
- }
- else if (state->token == &(toksource->skipToken))
- {
- // A real token could have been generated, but "Computer say's naaaaah" and it
- // it is just something we need to skip altogether.
- //
- continue;
- }
-
- // Good token, not skipped, not EOF token
- //
- return state->token;
- }
- }
- }
-}
-
-/**
- * \brief
- * Default implementation of the nextToken() call for a lexer.
- *
- * \param toksource
- * Points to the implementation of a token source. The lexer is
- * addressed by the super structure pointer.
- *
- * \returns
- * The next token in the current input stream or the EOF token
- * if there are no more tokens in any input stream in the stack.
- *
- * Write detailed description for nextToken here.
- *
- * \remarks
- * Write remarks for nextToken here.
- *
- * \see nextTokenStr
- */
-static pANTLR3_COMMON_TOKEN
-nextToken (pANTLR3_TOKEN_SOURCE toksource)
-{
- pANTLR3_COMMON_TOKEN tok;
-
- // Find the next token in the current stream
- //
- tok = nextTokenStr(toksource);
-
- // If we got to the EOF token then switch to the previous
- // input stream if there were any and just return the
- // EOF if there are none. We must check the next token
- // in any outstanding input stream we pop into the active
- // role to see if it was sitting at EOF after PUSHing the
- // stream we just consumed, otherwise we will return EOF
- // on the reinstalled input stream, when in actual fact
- // there might be more input streams to POP before the
- // real EOF of the whole logical inptu stream. Hence we
- // use a while loop here until we find somethign in the stream
- // that isn't EOF or we reach the actual end of the last input
- // stream on the stack.
- //
- while (tok->type == ANTLR3_TOKEN_EOF)
- {
- pANTLR3_LEXER lexer;
-
- lexer = (pANTLR3_LEXER)(toksource->super);
-
- if (lexer->rec->state->streams != NULL && lexer->rec->state->streams->size(lexer->rec->state->streams) > 0)
- {
- // We have another input stream in the stack so we
- // need to revert to it, then resume the loop to check
- // it wasn't sitting at EOF itself.
- //
- lexer->popCharStream(lexer);
- tok = nextTokenStr(toksource);
- }
- else
- {
- // There were no more streams on the input stack
- // so this EOF is the 'real' logical EOF for
- // the input stream. So we just exit the loop and
- // return the EOF we have found.
- //
- break;
- }
-
- }
-
- // return whatever token we have, which may be EOF
- //
- return tok;
-}
-
-ANTLR3_API pANTLR3_LEXER
-antlr3LexerNewStream(ANTLR3_UINT32 sizeHint, pANTLR3_INPUT_STREAM input, pANTLR3_RECOGNIZER_SHARED_STATE state)
-{
- pANTLR3_LEXER lexer;
-
- // Create a basic lexer first
- //
- lexer = antlr3LexerNew(sizeHint, state);
-
- if (lexer != NULL)
- {
- // Install the input stream and reset the lexer
- //
- setCharStream(lexer, input);
- }
-
- return lexer;
-}
-
-static void mTokens (pANTLR3_LEXER lexer)
-{
- if (lexer) // Fool compiler, avoid pragmas
- {
- ANTLR3_FPRINTF(stderr, "lexer->mTokens(): Error: No lexer rules were added to the lexer yet!\n");
- }
-}
-
-static void
-reportError (pANTLR3_BASE_RECOGNIZER rec)
-{
- // Indicate this recognizer had an error while processing.
- //
- rec->state->errorCount++;
-
- rec->displayRecognitionError(rec, rec->state->tokenNames);
-}
-
-#ifdef ANTLR3_WINDOWS
-#pragma warning( disable : 4100 )
-#endif
-
-/** Default lexer error handler (works for 8 bit streams only!!!)
- */
-static void
-displayRecognitionError (pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_UINT8 * tokenNames)
-{
- pANTLR3_LEXER lexer;
- pANTLR3_EXCEPTION ex;
- pANTLR3_STRING ftext;
-
- lexer = (pANTLR3_LEXER)(recognizer->super);
- ex = lexer->rec->state->exception;
-
- // See if there is a 'filename' we can use
- //
- if (ex->name == NULL)
- {
- ANTLR3_FPRINTF(stderr, "-unknown source-(");
- }
- else
- {
- ftext = ex->streamName->to8(ex->streamName);
- ANTLR3_FPRINTF(stderr, "%s(", ftext->chars);
- }
-
- ANTLR3_FPRINTF(stderr, "%d) ", recognizer->state->exception->line);
- ANTLR3_FPRINTF(stderr, ": lexer error %d :\n\t%s at offset %d, ",
- ex->type,
- (pANTLR3_UINT8) (ex->message),
- ex->charPositionInLine+1
- );
- {
- ANTLR3_INT32 width;
-
- width = ANTLR3_UINT32_CAST(( (pANTLR3_UINT8)(lexer->input->data) + (lexer->input->size(lexer->input) )) - (pANTLR3_UINT8)(ex->index));
-
- if (width >= 1)
- {
- if (isprint(ex->c))
- {
- ANTLR3_FPRINTF(stderr, "near '%c' :\n", ex->c);
- }
- else
- {
- ANTLR3_FPRINTF(stderr, "near char(%#02X) :\n", (ANTLR3_UINT8)(ex->c));
- }
- ANTLR3_FPRINTF(stderr, "\t%.*s\n", width > 20 ? 20 : width ,((pANTLR3_UINT8)ex->index));
- }
- else
- {
- ANTLR3_FPRINTF(stderr, "(end of input).\n\t This indicates a poorly specified lexer RULE\n\t or unterminated input element such as: \"STRING[\"]\n");
- ANTLR3_FPRINTF(stderr, "\t The lexer was matching from line %d, offset %d, which\n\t ",
- (ANTLR3_UINT32)(lexer->rec->state->tokenStartLine),
- (ANTLR3_UINT32)(lexer->rec->state->tokenStartCharPositionInLine)
- );
- width = ANTLR3_UINT32_CAST(((pANTLR3_UINT8)(lexer->input->data)+(lexer->input->size(lexer->input))) - (pANTLR3_UINT8)(lexer->rec->state->tokenStartCharIndex));
-
- if (width >= 1)
- {
- ANTLR3_FPRINTF(stderr, "looks like this:\n\t\t%.*s\n", width > 20 ? 20 : width ,(pANTLR3_UINT8)(lexer->rec->state->tokenStartCharIndex));
- }
- else
- {
- ANTLR3_FPRINTF(stderr, "is also the end of the line, so you must check your lexer rules\n");
- }
- }
- }
-}
-
-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;
-}
-
-/*!
- * \brief
- * Change to a new input stream, remembering the old one.
- *
- * \param lexer
- * Pointer to the lexer instance to switch input streams for.
- *
- * \param input
- * New input stream to install as the current one.
- *
- * Switches the current character input stream to
- * a new one, saving the old one, which we will revert to at the end of this
- * new one.
- */
-static void
-pushCharStream (pANTLR3_LEXER lexer, pANTLR3_INPUT_STREAM input)
-{
- // Do we need a new input stream stack?
- //
- if (lexer->rec->state->streams == NULL)
- {
- // This is the first call to stack a new
- // stream and so we must create the stack first.
- //
- lexer->rec->state->streams = antlr3StackNew(0);
-
- if (lexer->rec->state->streams == NULL)
- {
- // Could not do this, we just fail to push it.
- // TODO: Consider if this is what we want to do, but then
- // any programmer can override this method to do something else.
- return;
- }
- }
-
- // We have a stack, so we can save the current input stream
- // into it.
- //
- lexer->input->istream->mark(lexer->input->istream);
- lexer->rec->state->streams->push(lexer->rec->state->streams, lexer->input, NULL);
-
- // And now we can install this new one
- //
- lexer->setCharStream(lexer, input);
-}
-
-/*!
- * \brief
- * Stops using the current input stream and reverts to any prior
- * input stream on the stack.
- *
- * \param lexer
- * Description of parameter lexer.
- *
- * Pointer to a function that abandons the current input stream, whether it
- * is empty or not and reverts to the previous stacked input stream.
- *
- * \remark
- * The function fails silently if there are no prior input streams.
- */
-static void
-popCharStream (pANTLR3_LEXER lexer)
-{
- pANTLR3_INPUT_STREAM input;
-
- // If we do not have a stream stack or we are already at the
- // stack bottom, then do nothing.
- //
- if (lexer->rec->state->streams != NULL && lexer->rec->state->streams->size(lexer->rec->state->streams) > 0)
- {
- // We just leave the current stream to its fate, we do not close
- // it or anything as we do not know what the programmer intended
- // for it. This method can always be overridden of course.
- // So just find out what was currently saved on the stack and use
- // that now, then pop it from the stack.
- //
- input = (pANTLR3_INPUT_STREAM)(lexer->rec->state->streams->top);
- lexer->rec->state->streams->pop(lexer->rec->state->streams);
-
- // Now install the stream as the current one.
- //
- lexer->setCharStream(lexer, input);
- lexer->input->istream->rewindLast(lexer->input->istream);
- }
- return;
-}
-
-static void emitNew (pANTLR3_LEXER lexer, pANTLR3_COMMON_TOKEN token)
-{
- lexer->rec->state->token = token; /* Voila! */
-}
-
-static pANTLR3_COMMON_TOKEN
-emit (pANTLR3_LEXER lexer)
-{
- pANTLR3_COMMON_TOKEN token;
-
- /* We could check pointers to token factories and so on, but
- * we are in code that we want to run as fast as possible
- * so we are not checking any errors. So make sure you have installed an input stream before
- * trying to emit a new token.
- */
- token = lexer->rec->state->tokFactory->newToken(lexer->rec->state->tokFactory);
-
- /* Install the supplied information, and some other bits we already know
- * get added automatically, such as the input stream it is associated with
- * (though it can all be overridden of course)
- */
- token->type = lexer->rec->state->type;
- token->channel = lexer->rec->state->channel;
- token->start = lexer->rec->state->tokenStartCharIndex;
- token->stop = lexer->getCharIndex(lexer) - 1;
- token->line = lexer->rec->state->tokenStartLine;
- token->charPosition = lexer->rec->state->tokenStartCharPositionInLine;
-
- if (lexer->rec->state->text != NULL)
- {
- token->textState = ANTLR3_TEXT_STRING;
- token->tokText.text = lexer->rec->state->text;
- }
- else
- {
- token->textState = ANTLR3_TEXT_NONE;
- }
- token->lineStart = lexer->input->currentLine;
- token->user1 = lexer->rec->state->user1;
- token->user2 = lexer->rec->state->user2;
- token->user3 = lexer->rec->state->user3;
- token->custom = lexer->rec->state->custom;
-
- lexer->rec->state->token = token;
-
- return token;
-}
-
-/**
- * Free the resources allocated by a lexer
- */
-static void
-freeLexer (pANTLR3_LEXER lexer)
-{
- // This may have ben a delegate or delegator lexer, in which case the
- // state may already have been freed (and set to NULL therefore)
- // so we ignore the state if we don't have it.
- //
- if (lexer->rec->state != NULL)
- {
- if (lexer->rec->state->streams != NULL)
- {
- lexer->rec->state->streams->free(lexer->rec->state->streams);
- }
- if (lexer->rec->state->tokFactory != NULL)
- {
- lexer->rec->state->tokFactory->close(lexer->rec->state->tokFactory);
- lexer->rec->state->tokFactory = NULL;
- }
- if (lexer->rec->state->tokSource != NULL)
- {
- ANTLR3_FREE(lexer->rec->state->tokSource);
- lexer->rec->state->tokSource = NULL;
- }
- }
- if (lexer->rec != NULL)
- {
- lexer->rec->free(lexer->rec);
- lexer->rec = NULL;
- }
- ANTLR3_FREE(lexer);
-}
-
-/** Implementation of matchs for the lexer, overrides any
- * base implementation in the base recognizer.
- *
- * \remark
- * Note that the generated code lays down arrays of ints for constant
- * strings so that they are int UTF32 form!
- */
-static ANTLR3_BOOLEAN
-matchs(pANTLR3_LEXER lexer, ANTLR3_UCHAR * string)
-{
- while (*string != ANTLR3_STRING_TERMINATOR)
- {
- if (lexer->input->istream->_LA(lexer->input->istream, 1) != (*string))
- {
- if (lexer->rec->state->backtracking > 0)
- {
- lexer->rec->state->failed = ANTLR3_TRUE;
- return ANTLR3_FALSE;
- }
-
- lexer->rec->exConstruct(lexer->rec);
- lexer->rec->state->failed = ANTLR3_TRUE;
-
- /* TODO: Implement exception creation more fully perhaps
- */
- lexer->recover(lexer);
- return ANTLR3_FALSE;
- }
-
- /* Matched correctly, do consume it
- */
- lexer->input->istream->consume(lexer->input->istream);
- string++;
-
- /* Reset any failed indicator
- */
- lexer->rec->state->failed = ANTLR3_FALSE;
- }
-
-
- return ANTLR3_TRUE;
-}
-
-/** Implementation of matchc for the lexer, overrides any
- * base implementation in the base recognizer.
- *
- * \remark
- * Note that the generated code lays down arrays of ints for constant
- * strings so that they are int UTF32 form!
- */
-static ANTLR3_BOOLEAN
-matchc(pANTLR3_LEXER lexer, ANTLR3_UCHAR c)
-{
- if (lexer->input->istream->_LA(lexer->input->istream, 1) == c)
- {
- /* Matched correctly, do consume it
- */
- lexer->input->istream->consume(lexer->input->istream);
-
- /* Reset any failed indicator
- */
- lexer->rec->state->failed = ANTLR3_FALSE;
-
- return ANTLR3_TRUE;
- }
-
- /* Failed to match, exception and recovery time.
- */
- if (lexer->rec->state->backtracking > 0)
- {
- lexer->rec->state->failed = ANTLR3_TRUE;
- return ANTLR3_FALSE;
- }
-
- lexer->rec->exConstruct(lexer->rec);
-
- /* TODO: Implement exception creation more fully perhaps
- */
- lexer->recover(lexer);
-
- return ANTLR3_FALSE;
-}
-
-/** Implementation of match range for the lexer, overrides any
- * base implementation in the base recognizer.
- *
- * \remark
- * Note that the generated code lays down arrays of ints for constant
- * strings so that they are int UTF32 form!
- */
-static ANTLR3_BOOLEAN
-matchRange(pANTLR3_LEXER lexer, ANTLR3_UCHAR low, ANTLR3_UCHAR high)
-{
- ANTLR3_UCHAR c;
-
- /* What is in the stream at the moment?
- */
- c = lexer->input->istream->_LA(lexer->input->istream, 1);
- if ( c >= low && c <= high)
- {
- /* Matched correctly, consume it
- */
- lexer->input->istream->consume(lexer->input->istream);
-
- /* Reset any failed indicator
- */
- lexer->rec->state->failed = ANTLR3_FALSE;
-
- return ANTLR3_TRUE;
- }
-
- /* Failed to match, execption and recovery time.
- */
-
- if (lexer->rec->state->backtracking > 0)
- {
- lexer->rec->state->failed = ANTLR3_TRUE;
- return ANTLR3_FALSE;
- }
-
- lexer->rec->exConstruct(lexer->rec);
-
- /* TODO: Implement exception creation more fully
- */
- lexer->recover(lexer);
-
- return ANTLR3_FALSE;
-}
-
-static void
-matchAny (pANTLR3_LEXER lexer)
-{
- lexer->input->istream->consume(lexer->input->istream);
-}
-
-static void
-recover (pANTLR3_LEXER lexer)
-{
- lexer->input->istream->consume(lexer->input->istream);
-}
-
-static ANTLR3_UINT32
-getLine (pANTLR3_LEXER lexer)
-{
- return lexer->input->getLine(lexer->input);
-}
-
-static ANTLR3_UINT32
-getCharPositionInLine (pANTLR3_LEXER lexer)
-{
- return lexer->input->charPositionInLine;
-}
-
-static ANTLR3_MARKER getCharIndex (pANTLR3_LEXER lexer)
-{
- return lexer->input->istream->index(lexer->input->istream);
-}
-
-static pANTLR3_STRING
-getText (pANTLR3_LEXER lexer)
-{
- if (lexer->rec->state->text)
- {
- return lexer->rec->state->text;
-
- }
- return lexer->input->substr(
- lexer->input,
- lexer->rec->state->tokenStartCharIndex,
- lexer->getCharIndex(lexer) - lexer->input->charByteSize
- );
-
-}
-
-static void *
-getCurrentInputSymbol (pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_INT_STREAM istream)
-{
- return NULL;
-}
-
-static void *
-getMissingSymbol (pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_INT_STREAM istream, pANTLR3_EXCEPTION e,
- ANTLR3_UINT32 expectedTokenType, pANTLR3_BITSET_LIST follow)
-{
- return NULL;
-}