/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/* $ANTLR 2.7.7 (20130409): "CPP_parser.g" -> "CPPLexer.cpp"$ */
#ifndef _WIN32
#include <stdio.h>
#include <strings.h>
#endif
#include "CPPLexer.hpp"
#include <antlr/CharBuffer.hpp>
#include <antlr/TokenStreamException.hpp>
#include <antlr/TokenStreamIOException.hpp>
#include <antlr/TokenStreamRecognitionException.hpp>
#include <antlr/CharStreamException.hpp>
#include <antlr/CharStreamIOException.hpp>
#include <antlr/NoViableAltForCharException.hpp>

#line 1 "CPP_parser.g"
#line 13 "CPPLexer.cpp"
CPPLexer::CPPLexer(ANTLR_USE_NAMESPACE(std) istream& in)
    : ANTLR_USE_NAMESPACE(antlr)
          CharScanner(new ANTLR_USE_NAMESPACE(antlr) CharBuffer(in), true) {
  initLiterals();
}

CPPLexer::CPPLexer(ANTLR_USE_NAMESPACE(antlr) InputBuffer& ib)
    : ANTLR_USE_NAMESPACE(antlr) CharScanner(ib, true) {
  initLiterals();
}

CPPLexer::CPPLexer(const ANTLR_USE_NAMESPACE(antlr)
                       LexerSharedInputState& state)
    : ANTLR_USE_NAMESPACE(antlr) CharScanner(state, true) {
  initLiterals();
}

void CPPLexer::initLiterals() {
  literals["_cdecl"] = 164;
  literals["__stdcall"] = 26;
  literals["extern"] = 20;
  literals["public"] = 82;
  literals["namespace"] = 14;
  literals["case"] = 98;
  literals["short"] = 48;
  literals["break"] = 108;
  literals["while"] = 103;
  literals["__int8"] = 51;
  literals["delete"] = 174;
  literals["new"] = 163;
  literals["__declspec"] = 75;
  literals["uint32_t"] = 64;
  literals["int16_t"] = 55;
  literals["_int32"] = 56;
  literals["GFID"] = 29;
  literals["GFARRAYSIZE"] = 31;
  literals["__pascal"] = 173;
  literals["template"] = 4;
  literals["GFEXCLUDE"] = 27;
  literals["reinterpret_cast"] = 152;
  literals["inline"] = 12;
  literals["unsigned"] = 70;
  literals["const"] = 76;
  literals["float"] = 71;
  literals["_int8"] = 50;
  literals["__int16"] = 54;
  literals["static_cast"] = 151;
  literals["return"] = 109;
  literals["throw"] = 96;
  literals["int64_t"] = 61;
  literals["typename"] = 44;
  literals["using"] = 97;
  literals["operator"] = 85;
  literals["__far"] = 169;
  literals["sizeof"] = 145;
  literals["protected"] = 83;
  literals["class"] = 24;
  literals["_stdcall"] = 25;
  literals["friend"] = 13;
  literals["do"] = 104;
  literals["__interrupt"] = 170;
  literals["_far"] = 168;
  literals["typeid"] = 154;
  literals["__volatile__"] = 79;
  literals["__alignof__"] = 146;
  literals["__cdecl"] = 165;
  literals["_int64"] = 59;
  literals["__asm"] = 114;
  literals["pascal"] = 171;
  literals["typedef"] = 7;
  literals["__const"] = 77;
  literals["const_cast"] = 153;
  literals["__asm__"] = 115;
  literals["uint16_t"] = 63;
  literals["explicit"] = 43;
  literals["_asm"] = 113;
  literals["if"] = 100;
  literals["__int32"] = 57;
  literals["double"] = 72;
  literals["volatile"] = 78;
  literals["catch"] = 111;
  literals["dynamic_cast"] = 150;
  literals["union"] = 23;
  literals["try"] = 110;
  literals["register"] = 37;
  literals["_inline"] = 40;
  literals["auto"] = 36;
  literals["GFINCLUDE"] = 28;
  literals["goto"] = 106;
  literals["enum"] = 9;
  literals["int"] = 49;
  literals["for"] = 105;
  literals["int32_t"] = 58;
  literals["uint64_t"] = 65;
  literals["char"] = 45;
  literals["__near"] = 167;
  literals["private"] = 84;
  literals["GFARRAYELEMSIZE"] = 35;
  literals["default"] = 99;
  literals["false"] = 88;
  literals["this"] = 86;
  literals["static"] = 38;
  literals["mutable"] = 39;
  literals["int8_t"] = 52;
  literals["GFARRAYSIZES"] = 34;
  literals["uint8_t"] = 62;
  literals["_int16"] = 53;
  literals["continue"] = 107;
  literals["bool"] = 47;
  literals["struct"] = 22;
  literals["GFUNREAD"] = 30;
  literals["_near"] = 166;
  literals["__int64"] = 60;
  literals["signed"] = 69;
  literals["GFIGNORE"] = 80;
  literals["else"] = 101;
  literals["_declspec"] = 74;
  literals["_pascal"] = 172;
  literals["__w64"] = 67;
  literals["antlrTrace_on"] = 15;
  literals["void"] = 73;
  literals["antlrTrace_off"] = 16;
  literals["wchar_t"] = 46;
  literals["switch"] = 102;
  literals["__inline"] = 41;
  literals["true"] = 87;
  literals["long"] = 68;
  literals["asm"] = 112;
  literals["virtual"] = 42;
  literals["_w64"] = 66;
}

ANTLR_USE_NAMESPACE(antlr) RefToken CPPLexer::nextToken() {
  ANTLR_USE_NAMESPACE(antlr) RefToken theRetToken;
  for (;;) {
    ANTLR_USE_NAMESPACE(antlr) RefToken theRetToken;
    int _ttype = ANTLR_USE_NAMESPACE(antlr) Token::INVALID_TYPE;
    resetText();
    try {  // for lexical and char stream error handling
      switch (LA(1)) {
        case 0x2c /* ',' */: {
          mCOMMA(true);
          theRetToken = _returnToken;
          break;
        }
        case 0x3f /* '?' */: {
          mQUESTIONMARK(true);
          theRetToken = _returnToken;
          break;
        }
        case 0x3b /* ';' */: {
          mSEMICOLON(true);
          theRetToken = _returnToken;
          break;
        }
        case 0x28 /* '(' */: {
          mLPAREN(true);
          theRetToken = _returnToken;
          break;
        }
        case 0x29 /* ')' */: {
          mRPAREN(true);
          theRetToken = _returnToken;
          break;
        }
        case 0x5b /* '[' */: {
          mLSQUARE(true);
          theRetToken = _returnToken;
          break;
        }
        case 0x5d /* ']' */: {
          mRSQUARE(true);
          theRetToken = _returnToken;
          break;
        }
        case 0x7b /* '{' */: {
          mLCURLY(true);
          theRetToken = _returnToken;
          break;
        }
        case 0x7d /* '}' */: {
          mRCURLY(true);
          theRetToken = _returnToken;
          break;
        }
        case 0x7e /* '~' */: {
          mTILDE(true);
          theRetToken = _returnToken;
          break;
        }
        case 0x9 /* '\t' */:
        case 0xa /* '\n' */:
        case 0xc /* '\14' */:
        case 0xd /* '\r' */:
        case 0x20 /* ' ' */:
        case 0x5c /* '\\' */: {
          mWhitespace(true);
          theRetToken = _returnToken;
          break;
        }
        case 0x23 /* '#' */: {
          mPREPROC_DIRECTIVE(true);
          theRetToken = _returnToken;
          break;
        }
        case 0x22 /* '\"' */: {
          mStringLiteral(true);
          theRetToken = _returnToken;
          break;
        }
        case 0x27 /* '\'' */: {
          mCharLiteral(true);
          theRetToken = _returnToken;
          break;
        }
        default:
          if ((LA(1) == 0x3e /* '>' */) && (LA(2) == 0x3e /* '>' */) &&
              (LA(3) == 0x3d /* '=' */)) {
            mSHIFTRIGHTEQUAL(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x3c /* '<' */) && (LA(2) == 0x3c /* '<' */) &&
                     (LA(3) == 0x3d /* '=' */)) {
            mSHIFTLEFTEQUAL(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x2d /* '-' */) && (LA(2) == 0x3e /* '>' */) &&
                     (LA(3) == 0x2a /* '*' */)) {
            mPOINTERTOMBR(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x2d /* '-' */) && (LA(2) == 0x3e /* '>' */) &&
                     (true)) {
            mPOINTERTO(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x3d /* '=' */) && (LA(2) == 0x3d /* '=' */)) {
            mEQUAL(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x21 /* '!' */) && (LA(2) == 0x3d /* '=' */)) {
            mNOTEQUAL(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x3c /* '<' */) && (LA(2) == 0x3d /* '=' */)) {
            mLESSTHANOREQUALTO(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x3e /* '>' */) && (LA(2) == 0x3d /* '=' */)) {
            mGREATERTHANOREQUALTO(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x2f /* '/' */) && (LA(2) == 0x3d /* '=' */)) {
            mDIVIDEEQUAL(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x2b /* '+' */) && (LA(2) == 0x3d /* '=' */)) {
            mPLUSEQUAL(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x2b /* '+' */) && (LA(2) == 0x2b /* '+' */)) {
            mPLUSPLUS(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x2d /* '-' */) && (LA(2) == 0x3d /* '=' */)) {
            mMINUSEQUAL(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x2d /* '-' */) && (LA(2) == 0x2d /* '-' */)) {
            mMINUSMINUS(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x2a /* '*' */) && (LA(2) == 0x3d /* '=' */)) {
            mTIMESEQUAL(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x25 /* '%' */) && (LA(2) == 0x3d /* '=' */)) {
            mMODEQUAL(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x3e /* '>' */) && (LA(2) == 0x3e /* '>' */) &&
                     (true)) {
            mSHIFTRIGHT(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x3c /* '<' */) && (LA(2) == 0x3c /* '<' */) &&
                     (true)) {
            mSHIFTLEFT(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x26 /* '&' */) && (LA(2) == 0x26 /* '&' */)) {
            mAND(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x7c /* '|' */) && (LA(2) == 0x7c /* '|' */)) {
            mOR(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x26 /* '&' */) && (LA(2) == 0x3d /* '=' */)) {
            mBITWISEANDEQUAL(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x7c /* '|' */) && (LA(2) == 0x3d /* '=' */)) {
            mBITWISEOREQUAL(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x5e /* '^' */) && (LA(2) == 0x3d /* '=' */)) {
            mBITWISEXOREQUAL(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x2e /* '.' */) && (LA(2) == 0x2a /* '*' */)) {
            mDOTMBR(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x3a /* ':' */) && (LA(2) == 0x3a /* ':' */)) {
            mSCOPE(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x2f /* '/' */) && (LA(2) == 0x2a /* '*' */)) {
            mComment(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x2f /* '/' */) && (LA(2) == 0x2f /* '/' */)) {
            mCPPComment(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x4c /* 'L' */) && (LA(2) == 0x27 /* '\'' */)) {
            mWCharLiteral(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x4c /* 'L' */) && (LA(2) == 0x22 /* '\"' */)) {
            mWStringLiteral(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x3d /* '=' */) && (true)) {
            mASSIGNEQUAL(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x3a /* ':' */) && (true)) {
            mCOLON(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x3c /* '<' */) && (true)) {
            mLESSTHAN(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x3e /* '>' */) && (true)) {
            mGREATERTHAN(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x2f /* '/' */) && (true)) {
            mDIVIDE(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x2b /* '+' */) && (true)) {
            mPLUS(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x2d /* '-' */) && (true)) {
            mMINUS(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x2a /* '*' */) && (true)) {
            mSTAR(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x25 /* '%' */) && (true)) {
            mMOD(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x21 /* '!' */) && (true)) {
            mNOT(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x26 /* '&' */) && (true)) {
            mAMPERSAND(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x7c /* '|' */) && (true)) {
            mBITWISEOR(true);
            theRetToken = _returnToken;
          } else if ((LA(1) == 0x5e /* '^' */) && (true)) {
            mBITWISEXOR(true);
            theRetToken = _returnToken;
          } else if ((_tokenSet_0.member(LA(1))) && (true)) {
            mNumber(true);
            theRetToken = _returnToken;
          } else if ((_tokenSet_1.member(LA(1))) && (true)) {
            mID(true);
            theRetToken = _returnToken;
          } else {
            if (LA(1) == EOF_CHAR) {
              uponEOF();
              _returnToken =
                  makeToken(ANTLR_USE_NAMESPACE(antlr) Token::EOF_TYPE);
            } else {
              throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
                  LA(1), getFilename(), getLine(), getColumn());
            }
          }
      }
      if (!_returnToken) goto tryAgain;  // found SKIP token

      _ttype = _returnToken->getType();
      _ttype = testLiteralsTable(_ttype);
      _returnToken->setType(_ttype);
      return _returnToken;
    } catch (ANTLR_USE_NAMESPACE(antlr) RecognitionException& e) {
      throw ANTLR_USE_NAMESPACE(antlr) TokenStreamRecognitionException(e);
    } catch (ANTLR_USE_NAMESPACE(antlr) CharStreamIOException& csie) {
      throw ANTLR_USE_NAMESPACE(antlr) TokenStreamIOException(csie.io);
    } catch (ANTLR_USE_NAMESPACE(antlr) CharStreamException& cse) {
      throw ANTLR_USE_NAMESPACE(antlr) TokenStreamException(cse.getMessage());
    }
  tryAgain:;
  }
}

void CPPLexer::mASSIGNEQUAL(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = ASSIGNEQUAL;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match('=' /* charlit */);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mCOLON(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = COLON;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match(':' /* charlit */);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mCOMMA(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = COMMA;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match(',' /* charlit */);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mQUESTIONMARK(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = QUESTIONMARK;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match('?' /* charlit */);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mSEMICOLON(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = SEMICOLON;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match(';' /* charlit */);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mPOINTERTO(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = POINTERTO;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match("->");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mLPAREN(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = LPAREN;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match('(' /* charlit */);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mRPAREN(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = RPAREN;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match(')' /* charlit */);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mLSQUARE(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = LSQUARE;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match('[' /* charlit */);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mRSQUARE(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = RSQUARE;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match(']' /* charlit */);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mLCURLY(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = LCURLY;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match('{' /* charlit */);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mRCURLY(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = RCURLY;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match('}' /* charlit */);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mEQUAL(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = EQUAL;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match("==");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mNOTEQUAL(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = NOTEQUAL;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match("!=");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mLESSTHANOREQUALTO(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = LESSTHANOREQUALTO;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match("<=");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mLESSTHAN(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = LESSTHAN;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match("<");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mGREATERTHANOREQUALTO(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = GREATERTHANOREQUALTO;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match(">=");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mGREATERTHAN(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = GREATERTHAN;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match(">");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mDIVIDE(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = DIVIDE;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match('/' /* charlit */);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mDIVIDEEQUAL(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = DIVIDEEQUAL;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match("/=");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mPLUS(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = PLUS;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match('+' /* charlit */);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mPLUSEQUAL(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = PLUSEQUAL;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match("+=");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mPLUSPLUS(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = PLUSPLUS;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match("++");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mMINUS(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = MINUS;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match('-' /* charlit */);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mMINUSEQUAL(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = MINUSEQUAL;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match("-=");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mMINUSMINUS(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = MINUSMINUS;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match("--");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mSTAR(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = STAR;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match('*' /* charlit */);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mTIMESEQUAL(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = TIMESEQUAL;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match("*=");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mMOD(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = MOD;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match('%' /* charlit */);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mMODEQUAL(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = MODEQUAL;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match("%=");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mSHIFTRIGHT(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = SHIFTRIGHT;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match(">>");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mSHIFTRIGHTEQUAL(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = SHIFTRIGHTEQUAL;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match(">>=");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mSHIFTLEFT(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = SHIFTLEFT;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match("<<");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mSHIFTLEFTEQUAL(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = SHIFTLEFTEQUAL;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match("<<=");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mAND(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = AND;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match("&&");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mNOT(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = NOT;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match('!' /* charlit */);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mOR(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = OR;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match("||");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mAMPERSAND(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = AMPERSAND;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match('&' /* charlit */);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mBITWISEANDEQUAL(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = BITWISEANDEQUAL;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match("&=");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mTILDE(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = TILDE;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match('~' /* charlit */);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mBITWISEOR(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = BITWISEOR;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match('|' /* charlit */);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mBITWISEOREQUAL(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = BITWISEOREQUAL;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match("|=");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mBITWISEXOR(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = BITWISEXOR;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match('^' /* charlit */);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mBITWISEXOREQUAL(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = BITWISEXOREQUAL;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match("^=");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mPOINTERTOMBR(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = POINTERTOMBR;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match("->*");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mDOTMBR(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = DOTMBR;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match(".*");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mSCOPE(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = SCOPE;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match("::");
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mWhitespace(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = Whitespace;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  {
    switch (LA(1)) {
      case 0x9 /* '\t' */:
      case 0xc /* '\14' */:
      case 0x20 /* ' ' */: {
        {
          switch (LA(1)) {
            case 0x20 /* ' ' */: {
              match(' ' /* charlit */);
              break;
            }
            case 0x9 /* '\t' */: {
              match('\t' /* charlit */);
              break;
            }
            case 0xc /* '\14' */: {
              match('\14' /* charlit */);
              break;
            }
            default: {
              throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
                  LA(1), getFilename(), getLine(), getColumn());
            }
          }
        }
        break;
      }
      case 0xa /* '\n' */:
      case 0xd /* '\r' */: {
        {
          if ((LA(1) == 0xd /* '\r' */) && (LA(2) == 0xa /* '\n' */)) {
            match('\r' /* charlit */);
            match('\n' /* charlit */);
          } else if ((LA(1) == 0xd /* '\r' */) && (true)) {
            match('\r' /* charlit */);
          } else if ((LA(1) == 0xa /* '\n' */)) {
            match('\n' /* charlit */);
          } else {
            throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
                LA(1), getFilename(), getLine(), getColumn());
          }
        }
        if (inputState->guessing == 0) {
#line 2391 "CPP_parser.g"
          newline();
#line 1165 "CPPLexer.cpp"
        }
        break;
      }
      case 0x5c /* '\\' */: {
        {
          if ((LA(1) == 0x5c /* '\\' */) && (LA(2) == 0xd /* '\r' */) &&
              (LA(3) == 0xa /* '\n' */)) {
            match('\\' /* charlit */);
            match('\r' /* charlit */);
            match('\n' /* charlit */);
          } else if ((LA(1) == 0x5c /* '\\' */) && (LA(2) == 0xd /* '\r' */) &&
                     (true)) {
            match('\\' /* charlit */);
            match('\r' /* charlit */);
          } else if ((LA(1) == 0x5c /* '\\' */) && (LA(2) == 0xa /* '\n' */)) {
            match('\\' /* charlit */);
            match('\n' /* charlit */);
          } else {
            throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
                LA(1), getFilename(), getLine(), getColumn());
          }
        }
        if (inputState->guessing == 0) {
#line 2396 "CPP_parser.g"
          printf("CPP_parser.g continuation line detected\n");
          deferredNewline();
#line 1194 "CPPLexer.cpp"
        }
        break;
      }
      default: {
        throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
            LA(1), getFilename(), getLine(), getColumn());
      }
    }
  }
  if (inputState->guessing == 0) {
#line 2399 "CPP_parser.g"
    _ttype = ANTLR_USE_NAMESPACE(antlr) Token::SKIP;
#line 1207 "CPPLexer.cpp"
  }
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mComment(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = Comment;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match("/*");
  {  // ( ... )*
    for (;;) {
      if (((LA(1) == 0x2a /* '*' */) &&
           ((LA(2) >= 0x0 /* '\0' */ && LA(2) <= 0xff)) &&
           ((LA(3) >= 0x0 /* '\0' */ && LA(3) <= 0xff))) &&
          (LA(2) != '/')) {
        match('*' /* charlit */);
      } else if ((LA(1) == 0xa /* '\n' */ || LA(1) == 0xd /* '\r' */)) {
        mEndOfLine(false);
        if (inputState->guessing == 0) {
#line 2406 "CPP_parser.g"
          deferredNewline();
#line 1233 "CPPLexer.cpp"
        }
      } else if ((_tokenSet_2.member(LA(1)))) {
        { match(_tokenSet_2); }
      } else {
        goto _loop653;
      }
    }
  _loop653:;
  }  // ( ... )*
  match("*/");
  if (inputState->guessing == 0) {
#line 2409 "CPP_parser.g"
    _ttype = ANTLR_USE_NAMESPACE(antlr) Token::SKIP;
#line 1252 "CPPLexer.cpp"
  }
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mEndOfLine(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = EndOfLine;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  {
    if ((LA(1) == 0xd /* '\r' */) && (LA(2) == 0xa /* '\n' */) && (true)) {
      match("\r\n");
    } else if ((LA(1) == 0xd /* '\r' */) && (true) && (true)) {
      match('\r' /* charlit */);
    } else if ((LA(1) == 0xa /* '\n' */)) {
      match('\n' /* charlit */);
    } else {
      throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
          LA(1), getFilename(), getLine(), getColumn());
    }
  }
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mCPPComment(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = CPPComment;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match("//");
  {  // ( ... )*
    for (;;) {
      if ((_tokenSet_3.member(LA(1)))) {
        { match(_tokenSet_3); }
      } else {
        goto _loop657;
      }
    }
  _loop657:;
  }  // ( ... )*
  mEndOfLine(false);
  if (inputState->guessing == 0) {
#line 2415 "CPP_parser.g"
    _ttype = ANTLR_USE_NAMESPACE(antlr) Token::SKIP;
    newline();
#line 1314 "CPPLexer.cpp"
  }
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mPREPROC_DIRECTIVE(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = PREPROC_DIRECTIVE;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  {
    match('#' /* charlit */);
    {  // ( ... )*
      for (;;) {
        if ((_tokenSet_3.member(LA(1)))) {
          { match(_tokenSet_3); }
        } else {
          goto _loop662;
        }
      }
    _loop662:;
    }  // ( ... )*
    mEndOfLine(false);
  }
  if (inputState->guessing == 0) {
#line 2422 "CPP_parser.g"
    _ttype = ANTLR_USE_NAMESPACE(antlr) Token::SKIP;
    newline();
#line 1350 "CPPLexer.cpp"
  }
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mLineDirective(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = LineDirective;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;
  ANTLR_USE_NAMESPACE(antlr) RefToken n;
  ANTLR_USE_NAMESPACE(antlr) RefToken sl;

  {
    switch (LA(1)) {
      case 0x6c /* 'l' */: {
        match("line");
        break;
      }
      case 0x9 /* '\t' */:
      case 0xc /* '\14' */:
      case 0x20 /* ' ' */: {
        break;
      }
      default: {
        throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
            LA(1), getFilename(), getLine(), getColumn());
      }
    }
  }
  {  // ( ... )+
    int _cnt666 = 0;
    for (;;) {
      if ((LA(1) == 0x9 /* '\t' */ || LA(1) == 0xc /* '\14' */ ||
           LA(1) == 0x20 /* ' ' */)) {
        mSpace(false);
      } else {
        if (_cnt666 >= 1) {
          goto _loop666;
        } else {
          throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
              LA(1), getFilename(), getLine(), getColumn());
        }
      }

      _cnt666++;
    }
  _loop666:;
  }  // ( ... )+
  mDecimal(true);
  n = _returnToken;
  {  // ( ... )+
    int _cnt668 = 0;
    for (;;) {
      if ((LA(1) == 0x9 /* '\t' */ || LA(1) == 0xc /* '\14' */ ||
           LA(1) == 0x20 /* ' ' */)) {
        mSpace(false);
      } else {
        if (_cnt668 >= 1) {
          goto _loop668;
        } else {
          throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
              LA(1), getFilename(), getLine(), getColumn());
        }
      }

      _cnt668++;
    }
  _loop668:;
  }  // ( ... )+
  {
    mStringLiteral(true);
    sl = _returnToken;
  }
  {  // ( ... )*
    for (;;) {
      if ((LA(1) == 0x9 /* '\t' */ || LA(1) == 0xc /* '\14' */ ||
           LA(1) == 0x20 /* ' ' */)) {
        {  // ( ... )+
          int _cnt672 = 0;
          for (;;) {
            if ((LA(1) == 0x9 /* '\t' */ || LA(1) == 0xc /* '\14' */ ||
                 LA(1) == 0x20 /* ' ' */)) {
              mSpace(false);
            } else {
              if (_cnt672 >= 1) {
                goto _loop672;
              } else {
                throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
                    LA(1), getFilename(), getLine(), getColumn());
              }
            }

            _cnt672++;
          }
        _loop672:;
        }  // ( ... )+
        mDecimal(false);
      } else {
        goto _loop673;
      }
    }
  _loop673:;
  }  // ( ... )*
  if (inputState->guessing == 0) {
#line 2434 "CPP_parser.g"

    process_line_directive((sl->getText()).data(),
                           (n->getText()).data());  // see main()

#line 1451 "CPPLexer.cpp"
  }
  mEndOfLine(false);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mSpace(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = Space;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  {
    switch (LA(1)) {
      case 0x20 /* ' ' */: {
        match(' ' /* charlit */);
        break;
      }
      case 0x9 /* '\t' */: {
        match('\t' /* charlit */);
        break;
      }
      case 0xc /* '\14' */: {
        match('\14' /* charlit */);
        break;
      }
      default: {
        throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
            LA(1), getFilename(), getLine(), getColumn());
      }
    }
  }
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mDecimal(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = Decimal;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  {  // ( ... )+
    int _cnt710 = 0;
    for (;;) {
      if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */))) {
        matchRange('0', '9');
      } else {
        if (_cnt710 >= 1) {
          goto _loop710;
        } else {
          throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
              LA(1), getFilename(), getLine(), getColumn());
        }
      }

      _cnt710++;
    }
  _loop710:;
  }  // ( ... )+
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mStringLiteral(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = StringLiteral;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match('\"' /* charlit */);
  {  // ( ... )*
    for (;;) {
      if ((LA(1) == 0x5c /* '\\' */) && (_tokenSet_4.member(LA(2)))) {
        mEscape(false);
      } else if ((LA(1) == 0x5c /* '\\' */) &&
                 (LA(2) == 0xa /* '\n' */ || LA(2) == 0xd /* '\r' */)) {
        {
          if ((LA(1) == 0x5c /* '\\' */) && (LA(2) == 0xd /* '\r' */) &&
              (LA(3) == 0xa /* '\n' */)) {
            match("\\\r\n");
          } else if ((LA(1) == 0x5c /* '\\' */) && (LA(2) == 0xd /* '\r' */) &&
                     (_tokenSet_3.member(LA(3)))) {
            match("\\\r");
          } else if ((LA(1) == 0x5c /* '\\' */) && (LA(2) == 0xa /* '\n' */)) {
            match("\\\n");
          } else {
            throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
                LA(1), getFilename(), getLine(), getColumn());
          }
        }
        if (inputState->guessing == 0) {
#line 2496 "CPP_parser.g"
          deferredNewline();
#line 1555 "CPPLexer.cpp"
        }
      } else if ((_tokenSet_5.member(LA(1)))) {
        { match(_tokenSet_5); }
      } else {
        goto _loop694;
      }
    }
  _loop694:;
  }  // ( ... )*
  match('\"' /* charlit */);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mPragma(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = Pragma;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  {
    match('#' /* charlit */);
    match("pragma");
    {  // ( ... )*
      for (;;) {
        if ((_tokenSet_3.member(LA(1)))) {
          { match(_tokenSet_3); }
        } else {
          goto _loop680;
        }
      }
    _loop680:;
    }  // ( ... )*
    mEndOfLine(false);
  }
  if (inputState->guessing == 0) {
#line 2451 "CPP_parser.g"
    _ttype = ANTLR_USE_NAMESPACE(antlr) Token::SKIP;
    newline();
#line 1606 "CPPLexer.cpp"
  }
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mError(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = Error;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  {
    match('#' /* charlit */);
    match("error");
    {  // ( ... )*
      for (;;) {
        if ((_tokenSet_3.member(LA(1)))) {
          { match(_tokenSet_3); }
        } else {
          goto _loop685;
        }
      }
    _loop685:;
    }  // ( ... )*
    mEndOfLine(false);
  }
  if (inputState->guessing == 0) {
#line 2458 "CPP_parser.g"
    _ttype = ANTLR_USE_NAMESPACE(antlr) Token::SKIP;
    newline();
#line 1643 "CPPLexer.cpp"
  }
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mCharLiteral(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = CharLiteral;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match('\'' /* charlit */);
  {
    if ((LA(1) == 0x5c /* '\\' */) && (_tokenSet_4.member(LA(2))) &&
        (_tokenSet_6.member(LA(3)))) {
      mEscape(false);
    } else if ((_tokenSet_7.member(LA(1))) && (LA(2) == 0x27 /* '\'' */) &&
               (true)) {
      { match(_tokenSet_7); }
    } else {
      throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
          LA(1), getFilename(), getLine(), getColumn());
    }
  }
  match('\'' /* charlit */);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mEscape(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = Escape;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match('\\' /* charlit */);
  {
    switch (LA(1)) {
      case 0x61 /* 'a' */: {
        match('a' /* charlit */);
        break;
      }
      case 0x62 /* 'b' */: {
        match('b' /* charlit */);
        break;
      }
      case 0x66 /* 'f' */: {
        match('f' /* charlit */);
        break;
      }
      case 0x6e /* 'n' */: {
        match('n' /* charlit */);
        break;
      }
      case 0x72 /* 'r' */: {
        match('r' /* charlit */);
        break;
      }
      case 0x74 /* 't' */: {
        match('t' /* charlit */);
        break;
      }
      case 0x76 /* 'v' */: {
        match('v' /* charlit */);
        break;
      }
      case 0x22 /* '\"' */: {
        match('\"' /* charlit */);
        break;
      }
      case 0x27 /* '\'' */: {
        match('\'' /* charlit */);
        break;
      }
      case 0x5c /* '\\' */: {
        match('\\' /* charlit */);
        break;
      }
      case 0x3f /* '?' */: {
        match('?' /* charlit */);
        break;
      }
      case 0x30 /* '0' */:
      case 0x31 /* '1' */:
      case 0x32 /* '2' */:
      case 0x33 /* '3' */: {
        { matchRange('0', '3'); }
        {
          if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */)) &&
              (_tokenSet_3.member(LA(2))) && (true)) {
            mDigit(false);
            {
              if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */)) &&
                  (_tokenSet_3.member(LA(2))) && (true)) {
                mDigit(false);
              } else if ((_tokenSet_3.member(LA(1))) && (true) && (true)) {
              } else {
                throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
                    LA(1), getFilename(), getLine(), getColumn());
              }
            }
          } else if ((_tokenSet_3.member(LA(1))) && (true) && (true)) {
          } else {
            throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
                LA(1), getFilename(), getLine(), getColumn());
          }
        }
        break;
      }
      case 0x34 /* '4' */:
      case 0x35 /* '5' */:
      case 0x36 /* '6' */:
      case 0x37 /* '7' */: {
        { matchRange('4', '7'); }
        {
          if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */)) &&
              (_tokenSet_3.member(LA(2))) && (true)) {
            mDigit(false);
          } else if ((_tokenSet_3.member(LA(1))) && (true) && (true)) {
          } else {
            throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
                LA(1), getFilename(), getLine(), getColumn());
          }
        }
        break;
      }
      case 0x78 /* 'x' */: {
        match('x' /* charlit */);
        {  // ( ... )+
          int _cnt706 = 0;
          for (;;) {
            if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */)) &&
                (_tokenSet_3.member(LA(2))) && (true)) {
              mDigit(false);
            } else if (((LA(1) >= 0x61 /* 'a' */ && LA(1) <= 0x66 /* 'f' */)) &&
                       (_tokenSet_3.member(LA(2))) && (true)) {
              matchRange('a', 'f');
            } else if (((LA(1) >= 0x41 /* 'A' */ && LA(1) <= 0x46 /* 'F' */)) &&
                       (_tokenSet_3.member(LA(2))) && (true)) {
              matchRange('A', 'F');
            } else {
              if (_cnt706 >= 1) {
                goto _loop706;
              } else {
                throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
                    LA(1), getFilename(), getLine(), getColumn());
              }
            }

            _cnt706++;
          }
        _loop706:;
        }  // ( ... )+
        break;
      }
      default: {
        throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
            LA(1), getFilename(), getLine(), getColumn());
      }
    }
  }
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mWCharLiteral(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = WCharLiteral;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match('L' /* charlit */);
  mCharLiteral(false);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mWStringLiteral(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = WStringLiteral;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  match('L' /* charlit */);
  mStringLiteral(false);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mDigit(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = Digit;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  matchRange('0', '9');
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mLongSuffix(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = LongSuffix;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  switch (LA(1)) {
    case 0x6c /* 'l' */: {
      match('l' /* charlit */);
      break;
    }
    case 0x4c /* 'L' */: {
      match('L' /* charlit */);
      break;
    }
    default: {
      throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
          LA(1), getFilename(), getLine(), getColumn());
    }
  }
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mUnsignedSuffix(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = UnsignedSuffix;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  switch (LA(1)) {
    case 0x75 /* 'u' */: {
      match('u' /* charlit */);
      break;
    }
    case 0x55 /* 'U' */: {
      match('U' /* charlit */);
      break;
    }
    default: {
      throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
          LA(1), getFilename(), getLine(), getColumn());
    }
  }
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mFloatSuffix(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = FloatSuffix;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  switch (LA(1)) {
    case 0x66 /* 'f' */: {
      match('f' /* charlit */);
      break;
    }
    case 0x46 /* 'F' */: {
      match('F' /* charlit */);
      break;
    }
    default: {
      throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
          LA(1), getFilename(), getLine(), getColumn());
    }
  }
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mExponent(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = Exponent;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  {
    switch (LA(1)) {
      case 0x65 /* 'e' */: {
        match('e' /* charlit */);
        break;
      }
      case 0x45 /* 'E' */: {
        match('E' /* charlit */);
        break;
      }
      default: {
        throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
            LA(1), getFilename(), getLine(), getColumn());
      }
    }
  }
  {
    switch (LA(1)) {
      case 0x2b /* '+' */: {
        match('+' /* charlit */);
        break;
      }
      case 0x2d /* '-' */: {
        match('-' /* charlit */);
        break;
      }
      case 0x30 /* '0' */:
      case 0x31 /* '1' */:
      case 0x32 /* '2' */:
      case 0x33 /* '3' */:
      case 0x34 /* '4' */:
      case 0x35 /* '5' */:
      case 0x36 /* '6' */:
      case 0x37 /* '7' */:
      case 0x38 /* '8' */:
      case 0x39 /* '9' */: {
        break;
      }
      default: {
        throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
            LA(1), getFilename(), getLine(), getColumn());
      }
    }
  }
  {  // ( ... )+
    int _cnt718 = 0;
    for (;;) {
      if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */))) {
        mDigit(false);
      } else {
        if (_cnt718 >= 1) {
          goto _loop718;
        } else {
          throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
              LA(1), getFilename(), getLine(), getColumn());
        }
      }

      _cnt718++;
    }
  _loop718:;
  }  // ( ... )+
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mVocabulary(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = Vocabulary;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  matchRange('\3', static_cast<unsigned char>('\377'));
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mNumber(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = Number;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  bool synPredMatched725 = false;
  if ((((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */)) &&
       (_tokenSet_8.member(LA(2))) && (true))) {
    int _m725 = mark();
    synPredMatched725 = true;
    inputState->guessing++;
    try {
      {
        {  // ( ... )+
          int _cnt723 = 0;
          for (;;) {
            if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */))) {
              mDigit(false);
            } else {
              if (_cnt723 >= 1) {
                goto _loop723;
              } else {
                throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
                    LA(1), getFilename(), getLine(), getColumn());
              }
            }

            _cnt723++;
          }
        _loop723:;
        }  // ( ... )+
        {
          switch (LA(1)) {
            case 0x2e /* '.' */: {
              match('.' /* charlit */);
              break;
            }
            case 0x65 /* 'e' */: {
              match('e' /* charlit */);
              break;
            }
            case 0x45 /* 'E' */: {
              match('E' /* charlit */);
              break;
            }
            default: {
              throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
                  LA(1), getFilename(), getLine(), getColumn());
            }
          }
        }
      }
    } catch (ANTLR_USE_NAMESPACE(antlr) RecognitionException& pe) {
      synPredMatched725 = false;
    }
    rewind(_m725);
    inputState->guessing--;
  }
  if (synPredMatched725) {
    {  // ( ... )+
      int _cnt727 = 0;
      for (;;) {
        if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */))) {
          mDigit(false);
        } else {
          if (_cnt727 >= 1) {
            goto _loop727;
          } else {
            throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
                LA(1), getFilename(), getLine(), getColumn());
          }
        }

        _cnt727++;
      }
    _loop727:;
    }  // ( ... )+
    {
      switch (LA(1)) {
        case 0x2e /* '.' */: {
          match('.' /* charlit */);
          {  // ( ... )*
            for (;;) {
              if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */))) {
                mDigit(false);
              } else {
                goto _loop730;
              }
            }
          _loop730:;
          }  // ( ... )*
          {
            if ((LA(1) == 0x45 /* 'E' */ || LA(1) == 0x65 /* 'e' */)) {
              mExponent(false);
            } else {
            }
          }
          if (inputState->guessing == 0) {
#line 2606 "CPP_parser.g"
            _ttype = FLOATONE;
#line 2158 "CPPLexer.cpp"
          }
          break;
        }
        case 0x45 /* 'E' */:
        case 0x65 /* 'e' */: {
          mExponent(false);
          if (inputState->guessing == 0) {
#line 2607 "CPP_parser.g"
            _ttype = FLOATTWO;
#line 2169 "CPPLexer.cpp"
          }
          break;
        }
        default: {
          throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
              LA(1), getFilename(), getLine(), getColumn());
        }
      }
    }
    {
      switch (LA(1)) {
        case 0x46 /* 'F' */:
        case 0x66 /* 'f' */: {
          mFloatSuffix(false);
          break;
        }
        case 0x4c /* 'L' */:
        case 0x6c /* 'l' */: {
          mLongSuffix(false);
          break;
        }
        default: {}
      }
    }
  } else {
    bool synPredMatched734 = false;
    if (((LA(1) == 0x2e /* '.' */) && (LA(2) == 0x2e /* '.' */))) {
      int _m734 = mark();
      synPredMatched734 = true;
      inputState->guessing++;
      try {
        { match("..."); }
      } catch (ANTLR_USE_NAMESPACE(antlr) RecognitionException& pe) {
        synPredMatched734 = false;
      }
      rewind(_m734);
      inputState->guessing--;
    }
    if (synPredMatched734) {
      match("...");
      if (inputState->guessing == 0) {
#line 2613 "CPP_parser.g"
        _ttype = ELLIPSIS;
#line 2221 "CPPLexer.cpp"
      }
    } else if ((LA(1) == 0x30 /* '0' */) &&
               (LA(2) == 0x58 /* 'X' */ || LA(2) == 0x78 /* 'x' */)) {
      match('0' /* charlit */);
      {
        switch (LA(1)) {
          case 0x78 /* 'x' */: {
            match('x' /* charlit */);
            break;
          }
          case 0x58 /* 'X' */: {
            match('X' /* charlit */);
            break;
          }
          default: {
            throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
                LA(1), getFilename(), getLine(), getColumn());
          }
        }
      }
      {  // ( ... )+
        int _cnt750 = 0;
        for (;;) {
          switch (LA(1)) {
            case 0x61 /* 'a' */:
            case 0x62 /* 'b' */:
            case 0x63 /* 'c' */:
            case 0x64 /* 'd' */:
            case 0x65 /* 'e' */:
            case 0x66 /* 'f' */: {
              matchRange('a', 'f');
              break;
            }
            case 0x41 /* 'A' */:
            case 0x42 /* 'B' */:
            case 0x43 /* 'C' */:
            case 0x44 /* 'D' */:
            case 0x45 /* 'E' */:
            case 0x46 /* 'F' */: {
              matchRange('A', 'F');
              break;
            }
            case 0x30 /* '0' */:
            case 0x31 /* '1' */:
            case 0x32 /* '2' */:
            case 0x33 /* '3' */:
            case 0x34 /* '4' */:
            case 0x35 /* '5' */:
            case 0x36 /* '6' */:
            case 0x37 /* '7' */:
            case 0x38 /* '8' */:
            case 0x39 /* '9' */: {
              mDigit(false);
              break;
            }
            default: {
              if (_cnt750 >= 1) {
                goto _loop750;
              } else {
                throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
                    LA(1), getFilename(), getLine(), getColumn());
              }
            }
          }
          _cnt750++;
        }
      _loop750:;
      }  // ( ... )+
      {  // ( ... )*
        for (;;) {
          switch (LA(1)) {
            case 0x4c /* 'L' */:
            case 0x6c /* 'l' */: {
              mLongSuffix(false);
              break;
            }
            case 0x55 /* 'U' */:
            case 0x75 /* 'u' */: {
              mUnsignedSuffix(false);
              break;
            }
            default: { goto _loop752; }
          }
        }
      _loop752:;
      }  // ( ... )*
      if (inputState->guessing == 0) {
#line 2637 "CPP_parser.g"
        _ttype = HEXADECIMALINT;
#line 2317 "CPPLexer.cpp"
      }
    } else if ((LA(1) == 0x2e /* '.' */) && (true)) {
      match('.' /* charlit */);
      if (inputState->guessing == 0) {
#line 2615 "CPP_parser.g"
        _ttype = DOT;
#line 2325 "CPPLexer.cpp"
      }
      {
        if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */))) {
          {  // ( ... )+
            int _cnt737 = 0;
            for (;;) {
              if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */))) {
                mDigit(false);
              } else {
                if (_cnt737 >= 1) {
                  goto _loop737;
                } else {
                  throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
                      LA(1), getFilename(), getLine(), getColumn());
                }
              }

              _cnt737++;
            }
          _loop737:;
          }  // ( ... )+
          {
            if ((LA(1) == 0x45 /* 'E' */ || LA(1) == 0x65 /* 'e' */)) {
              mExponent(false);
            } else {
            }
          }
          if (inputState->guessing == 0) {
#line 2616 "CPP_parser.g"
            _ttype = FLOATONE;
#line 2354 "CPPLexer.cpp"
          }
          {
            switch (LA(1)) {
              case 0x46 /* 'F' */:
              case 0x66 /* 'f' */: {
                mFloatSuffix(false);
                break;
              }
              case 0x4c /* 'L' */:
              case 0x6c /* 'l' */: {
                mLongSuffix(false);
                break;
              }
              default: {}
            }
          }
        } else {
        }
      }
    } else if ((LA(1) == 0x30 /* '0' */) && (true) && (true)) {
      match('0' /* charlit */);
      {  // ( ... )*
        for (;;) {
          if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x37 /* '7' */))) {
            matchRange('0', '7');
          } else {
            goto _loop741;
          }
        }
      _loop741:;
      }  // ( ... )*
      {  // ( ... )*
        for (;;) {
          switch (LA(1)) {
            case 0x4c /* 'L' */:
            case 0x6c /* 'l' */: {
              mLongSuffix(false);
              break;
            }
            case 0x55 /* 'U' */:
            case 0x75 /* 'u' */: {
              mUnsignedSuffix(false);
              break;
            }
            default: { goto _loop743; }
          }
        }
      _loop743:;
      }  // ( ... )*
      if (inputState->guessing == 0) {
#line 2626 "CPP_parser.g"
        _ttype = OCTALINT;
#line 2421 "CPPLexer.cpp"
      }
    } else if (((LA(1) >= 0x31 /* '1' */ && LA(1) <= 0x39 /* '9' */)) &&
               (true) && (true)) {
      matchRange('1', '9');
      {  // ( ... )*
        for (;;) {
          if (((LA(1) >= 0x30 /* '0' */ && LA(1) <= 0x39 /* '9' */))) {
            mDigit(false);
          } else {
            goto _loop745;
          }
        }
      _loop745:;
      }  // ( ... )*
      {  // ( ... )*
        for (;;) {
          switch (LA(1)) {
            case 0x4c /* 'L' */:
            case 0x6c /* 'l' */: {
              mLongSuffix(false);
              break;
            }
            case 0x55 /* 'U' */:
            case 0x75 /* 'u' */: {
              mUnsignedSuffix(false);
              break;
            }
            default: { goto _loop747; }
          }
        }
      _loop747:;
      }  // ( ... )*
      if (inputState->guessing == 0) {
#line 2631 "CPP_parser.g"
        _ttype = DECIMALINT;
#line 2464 "CPPLexer.cpp"
      }
    } else {
      throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
          LA(1), getFilename(), getLine(), getColumn());
    }
  }
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

void CPPLexer::mID(bool _createToken) {
  int _ttype;
  ANTLR_USE_NAMESPACE(antlr) RefToken _token;
  ANTLR_USE_NAMESPACE(std) string::size_type _begin = text.length();
  _ttype = ID;
  ANTLR_USE_NAMESPACE(std) string::size_type _saveIndex;

  {
    switch (LA(1)) {
      case 0x61 /* 'a' */:
      case 0x62 /* 'b' */:
      case 0x63 /* 'c' */:
      case 0x64 /* 'd' */:
      case 0x65 /* 'e' */:
      case 0x66 /* 'f' */:
      case 0x67 /* 'g' */:
      case 0x68 /* 'h' */:
      case 0x69 /* 'i' */:
      case 0x6a /* 'j' */:
      case 0x6b /* 'k' */:
      case 0x6c /* 'l' */:
      case 0x6d /* 'm' */:
      case 0x6e /* 'n' */:
      case 0x6f /* 'o' */:
      case 0x70 /* 'p' */:
      case 0x71 /* 'q' */:
      case 0x72 /* 'r' */:
      case 0x73 /* 's' */:
      case 0x74 /* 't' */:
      case 0x75 /* 'u' */:
      case 0x76 /* 'v' */:
      case 0x77 /* 'w' */:
      case 0x78 /* 'x' */:
      case 0x79 /* 'y' */:
      case 0x7a /* 'z' */: {
        matchRange('a', 'z');
        break;
      }
      case 0x41 /* 'A' */:
      case 0x42 /* 'B' */:
      case 0x43 /* 'C' */:
      case 0x44 /* 'D' */:
      case 0x45 /* 'E' */:
      case 0x46 /* 'F' */:
      case 0x47 /* 'G' */:
      case 0x48 /* 'H' */:
      case 0x49 /* 'I' */:
      case 0x4a /* 'J' */:
      case 0x4b /* 'K' */:
      case 0x4c /* 'L' */:
      case 0x4d /* 'M' */:
      case 0x4e /* 'N' */:
      case 0x4f /* 'O' */:
      case 0x50 /* 'P' */:
      case 0x51 /* 'Q' */:
      case 0x52 /* 'R' */:
      case 0x53 /* 'S' */:
      case 0x54 /* 'T' */:
      case 0x55 /* 'U' */:
      case 0x56 /* 'V' */:
      case 0x57 /* 'W' */:
      case 0x58 /* 'X' */:
      case 0x59 /* 'Y' */:
      case 0x5a /* 'Z' */: {
        matchRange('A', 'Z');
        break;
      }
      case 0x5f /* '_' */: {
        match('_' /* charlit */);
        break;
      }
      default: {
        throw ANTLR_USE_NAMESPACE(antlr) NoViableAltForCharException(
            LA(1), getFilename(), getLine(), getColumn());
      }
    }
  }
  {  // ( ... )*
    for (;;) {
      switch (LA(1)) {
        case 0x61 /* 'a' */:
        case 0x62 /* 'b' */:
        case 0x63 /* 'c' */:
        case 0x64 /* 'd' */:
        case 0x65 /* 'e' */:
        case 0x66 /* 'f' */:
        case 0x67 /* 'g' */:
        case 0x68 /* 'h' */:
        case 0x69 /* 'i' */:
        case 0x6a /* 'j' */:
        case 0x6b /* 'k' */:
        case 0x6c /* 'l' */:
        case 0x6d /* 'm' */:
        case 0x6e /* 'n' */:
        case 0x6f /* 'o' */:
        case 0x70 /* 'p' */:
        case 0x71 /* 'q' */:
        case 0x72 /* 'r' */:
        case 0x73 /* 's' */:
        case 0x74 /* 't' */:
        case 0x75 /* 'u' */:
        case 0x76 /* 'v' */:
        case 0x77 /* 'w' */:
        case 0x78 /* 'x' */:
        case 0x79 /* 'y' */:
        case 0x7a /* 'z' */: {
          matchRange('a', 'z');
          break;
        }
        case 0x41 /* 'A' */:
        case 0x42 /* 'B' */:
        case 0x43 /* 'C' */:
        case 0x44 /* 'D' */:
        case 0x45 /* 'E' */:
        case 0x46 /* 'F' */:
        case 0x47 /* 'G' */:
        case 0x48 /* 'H' */:
        case 0x49 /* 'I' */:
        case 0x4a /* 'J' */:
        case 0x4b /* 'K' */:
        case 0x4c /* 'L' */:
        case 0x4d /* 'M' */:
        case 0x4e /* 'N' */:
        case 0x4f /* 'O' */:
        case 0x50 /* 'P' */:
        case 0x51 /* 'Q' */:
        case 0x52 /* 'R' */:
        case 0x53 /* 'S' */:
        case 0x54 /* 'T' */:
        case 0x55 /* 'U' */:
        case 0x56 /* 'V' */:
        case 0x57 /* 'W' */:
        case 0x58 /* 'X' */:
        case 0x59 /* 'Y' */:
        case 0x5a /* 'Z' */: {
          matchRange('A', 'Z');
          break;
        }
        case 0x5f /* '_' */: {
          match('_' /* charlit */);
          break;
        }
        case 0x30 /* '0' */:
        case 0x31 /* '1' */:
        case 0x32 /* '2' */:
        case 0x33 /* '3' */:
        case 0x34 /* '4' */:
        case 0x35 /* '5' */:
        case 0x36 /* '6' */:
        case 0x37 /* '7' */:
        case 0x38 /* '8' */:
        case 0x39 /* '9' */: {
          matchRange('0', '9');
          break;
        }
        default: { goto _loop756; }
      }
    }
  _loop756:;
  }  // ( ... )*
  _ttype = testLiteralsTable(_ttype);
  if (_createToken && _token == ANTLR_USE_NAMESPACE(antlr) nullToken &&
      _ttype != ANTLR_USE_NAMESPACE(antlr) Token::SKIP) {
    _token = makeToken(_ttype);
    _token->setText(text.substr(_begin, text.length() - _begin));
  }
  _returnToken = _token;
  _saveIndex = 0;
}

const unsigned long CPPLexer::_tokenSet_0_data_[] = {
    0UL, 67059712UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL};
// . 0 1 2 3 4 5 6 7 8 9
const ANTLR_USE_NAMESPACE(antlr) BitSet CPPLexer::_tokenSet_0(_tokenSet_0_data_,
                                                              10);
const unsigned long CPPLexer::_tokenSet_1_data_[] = {
    0UL, 0UL, 2281701374UL, 134217726UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL};
// A B C D E F G H I J K L M N O P Q R S T U V W X Y Z _ a b c d e f g
// h i j k l m n o p q r s t u v w x y z
const ANTLR_USE_NAMESPACE(antlr) BitSet CPPLexer::_tokenSet_1(_tokenSet_1_data_,
                                                              10);
const unsigned long CPPLexer::_tokenSet_2_data_[] = {
    4294958079UL, 4294966271UL, 4294967295UL, 4294967295UL,
    4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL,
    0UL,          0UL,          0UL,          0UL,
    0UL,          0UL,          0UL,          0UL};
// 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xb 0xc 0xe 0xf 0x10 0x11 0x12
// 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f   !
// \" # $ % & \' ( ) + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C
// D E F G H I J K L M N O P Q R S T U V W X Y Z [ 0x5c ] ^ _ ` a b c d
// e f g h i j k l m n o p q r s t u v w x y z { | } ~ 0x7f 0x80 0x81 0x82
// 0x83 0x84 0x85 0x86 0x87 0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8e 0x8f 0x90
// 0x91 0x92 0x93 0x94 0x95 0x96 0x97 0x98 0x99 0x9a 0x9b 0x9c 0x9d 0x9e
// 0x9f 0xa0 0xa1 0xa2 0xa3 0xa4 0xa5 0xa6 0xa7 0xa8 0xa9 0xaa 0xab 0xac
// 0xad 0xae 0xaf 0xb0 0xb1 0xb2 0xb3 0xb4 0xb5 0xb6 0xb7 0xb8 0xb9 0xba
// 0xbb 0xbc 0xbd 0xbe 0xbf 0xc0
const ANTLR_USE_NAMESPACE(antlr) BitSet CPPLexer::_tokenSet_2(_tokenSet_2_data_,
                                                              16);
const unsigned long CPPLexer::_tokenSet_3_data_[] = {
    4294958079UL, 4294967295UL, 4294967295UL, 4294967295UL,
    4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL,
    0UL,          0UL,          0UL,          0UL,
    0UL,          0UL,          0UL,          0UL};
// 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xb 0xc 0xe 0xf 0x10 0x11 0x12
// 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f   !
// \" # $ % & \' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B
// C D E F G H I J K L M N O P Q R S T U V W X Y Z [ 0x5c ] ^ _ ` a b c
// d e f g h i j k l m n o p q r s t u v w x y z { | } ~ 0x7f 0x80 0x81
// 0x82 0x83 0x84 0x85 0x86 0x87 0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8e 0x8f
// 0x90 0x91 0x92 0x93 0x94 0x95 0x96 0x97 0x98 0x99 0x9a 0x9b 0x9c 0x9d
// 0x9e 0x9f 0xa0 0xa1 0xa2 0xa3 0xa4 0xa5 0xa6 0xa7 0xa8 0xa9 0xaa 0xab
// 0xac 0xad 0xae 0xaf 0xb0 0xb1 0xb2 0xb3 0xb4 0xb5 0xb6 0xb7 0xb8 0xb9
// 0xba 0xbb 0xbc 0xbd 0xbe 0xbf 0xc0
const ANTLR_USE_NAMESPACE(antlr) BitSet CPPLexer::_tokenSet_3(_tokenSet_3_data_,
                                                              16);
const unsigned long CPPLexer::_tokenSet_4_data_[] = {
    0UL, 2164195460UL, 268435456UL, 22298694UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL};
// \" \' 0 1 2 3 4 5 6 7 ? 0x5c a b f n r t v x
const ANTLR_USE_NAMESPACE(antlr) BitSet CPPLexer::_tokenSet_4(_tokenSet_4_data_,
                                                              10);
const unsigned long CPPLexer::_tokenSet_5_data_[] = {
    4294958079UL, 4294967291UL, 4026531839UL, 4294967295UL,
    4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL,
    0UL,          0UL,          0UL,          0UL,
    0UL,          0UL,          0UL,          0UL};
// 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xb 0xc 0xe 0xf 0x10 0x11 0x12
// 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e 0x1f   !
// # $ % & \' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D
// E F G H I J K L M N O P Q R S T U V W X Y Z [ ] ^ _ ` a b c d e f g
// h i j k l m n o p q r s t u v w x y z { | } ~ 0x7f 0x80 0x81 0x82 0x83
// 0x84 0x85 0x86 0x87 0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8e 0x8f 0x90 0x91
// 0x92 0x93 0x94 0x95 0x96 0x97 0x98 0x99 0x9a 0x9b 0x9c 0x9d 0x9e 0x9f
// 0xa0 0xa1 0xa2 0xa3 0xa4 0xa5 0xa6 0xa7 0xa8 0xa9 0xaa 0xab 0xac 0xad
// 0xae 0xaf 0xb0 0xb1 0xb2 0xb3 0xb4 0xb5 0xb6 0xb7 0xb8 0xb9 0xba 0xbb
// 0xbc 0xbd 0xbe 0xbf 0xc0
const ANTLR_USE_NAMESPACE(antlr) BitSet CPPLexer::_tokenSet_5(_tokenSet_5_data_,
                                                              16);
const unsigned long CPPLexer::_tokenSet_6_data_[] = {
    0UL, 67043456UL, 126UL, 126UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL};
// \' 0 1 2 3 4 5 6 7 8 9 A B C D E F a b c d e f
const ANTLR_USE_NAMESPACE(antlr) BitSet CPPLexer::_tokenSet_6(_tokenSet_6_data_,
                                                              10);
const unsigned long CPPLexer::_tokenSet_7_data_[] = {
    4294967295UL, 4294967167UL, 4294967295UL, 4294967295UL,
    4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL,
    0UL,          0UL,          0UL,          0UL,
    0UL,          0UL,          0UL,          0UL};
// 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7 0x8 0x9 0xa 0xb 0xc 0xd 0xe 0xf 0x10
// 0x11 0x12 0x13 0x14 0x15 0x16 0x17 0x18 0x19 0x1a 0x1b 0x1c 0x1d 0x1e
// 0x1f   ! \" # $ % & ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ?
// @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ 0x5c ] ^ _ `
// a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ 0x7f 0x80
// 0x81 0x82 0x83 0x84 0x85 0x86 0x87 0x88 0x89 0x8a 0x8b 0x8c 0x8d 0x8e
// 0x8f 0x90 0x91 0x92 0x93 0x94 0x95 0x96 0x97 0x98 0x99 0x9a 0x9b 0x9c
// 0x9d 0x9e 0x9f 0xa0 0xa1 0xa2 0xa3 0xa4 0xa5 0xa6 0xa7 0xa8 0xa9 0xaa
// 0xab 0xac 0xad 0xae 0xaf 0xb0 0xb1 0xb2 0xb3 0xb4 0xb5 0xb6 0xb7 0xb8
// 0xb9 0xba 0xbb 0xbc 0xbd 0xbe 0xbf 0xc0
const ANTLR_USE_NAMESPACE(antlr) BitSet CPPLexer::_tokenSet_7(_tokenSet_7_data_,
                                                              16);
const unsigned long CPPLexer::_tokenSet_8_data_[] = {
    0UL, 67059712UL, 32UL, 32UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL};
// . 0 1 2 3 4 5 6 7 8 9 E e
const ANTLR_USE_NAMESPACE(antlr) BitSet CPPLexer::_tokenSet_8(_tokenSet_8_data_,
                                                              10);
