#include <cmConfigure.h>

#include "cmStandardIncludes.h"
#line 2 "cmDependsJavaLexer.cxx"

#line 4 "cmDependsJavaLexer.cxx"

#define  YY_INT_ALIGNED short int

/* A lexical scanner generated by flex */

#define FLEX_SCANNER
#define YY_FLEX_MAJOR_VERSION 2
#define YY_FLEX_MINOR_VERSION 5
#define YY_FLEX_SUBMINOR_VERSION 31
#if YY_FLEX_SUBMINOR_VERSION > 0
#define FLEX_BETA
#endif

/* First, we deal with  platform-specific or compiler-specific issues. */

/* begin standard C headers. */
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>

#if defined(__BEOS__) || defined (__HAIKU__)
#include <unistd.h>   /* prevents a conflict with a #define later on... */
#endif

/* end standard C headers. */

/* flex integer type definitions */

#ifndef FLEXINT_H
#define FLEXINT_H

/* C99 systems have <inttypes.h>. Non-C99 systems may or may not. */

#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L
#include <inttypes.h>
typedef int8_t flex_int8_t;
typedef uint8_t flex_uint8_t;
typedef int16_t flex_int16_t;
typedef uint16_t flex_uint16_t;
typedef int32_t flex_int32_t;
typedef uint32_t flex_uint32_t;
#else
typedef signed char flex_int8_t;
typedef short int flex_int16_t;
typedef int flex_int32_t;
typedef unsigned char flex_uint8_t;
typedef unsigned short int flex_uint16_t;
typedef unsigned int flex_uint32_t;
#endif /* ! C99 */

/* Limits of integral types. */
#ifndef INT8_MIN
#define INT8_MIN               (-128)
#endif
#ifndef INT16_MIN
#define INT16_MIN              (-32767-1)
#endif
#ifndef INT32_MIN
#define INT32_MIN              (-2147483647-1)
#endif
#ifndef INT8_MAX
#define INT8_MAX               (127)
#endif
#ifndef INT16_MAX
#define INT16_MAX              (32767)
#endif
#ifndef INT32_MAX
#define INT32_MAX              (2147483647)
#endif
#ifndef UINT8_MAX
#define UINT8_MAX              (255U)
#endif
#ifndef UINT16_MAX
#define UINT16_MAX             (65535U)
#endif
#ifndef UINT32_MAX
#define UINT32_MAX             (4294967295U)
#endif

#endif /* ! FLEXINT_H */

#ifdef __cplusplus

/* The "const" storage-class-modifier is valid. */
#define YY_USE_CONST

#else  /* ! __cplusplus */

#if __STDC__

#define YY_USE_CONST

#endif  /* __STDC__ */
#endif  /* ! __cplusplus */

#ifdef YY_USE_CONST
#define yyconst const
#else
#define yyconst
#endif

/* Returned upon end-of-file. */
#define YY_NULL 0

/* Promotes a possibly negative, possibly signed char to an unsigned
 * integer for use as an array index.  If the signed char is negative,
 * we want to instead treat it as an 8-bit unsigned char, hence the
 * double cast.
 */
#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)

/* An opaque pointer. */
#ifndef YY_TYPEDEF_YY_SCANNER_T
#define YY_TYPEDEF_YY_SCANNER_T
typedef void* yyscan_t;
#endif

/* For convenience, these vars (plus the bison vars far below)
   are macros in the reentrant scanner. */
#define yyin yyg->yyin_r
#define yyout yyg->yyout_r
#define yyextra yyg->yyextra_r
#define yyleng yyg->yyleng_r
#define yytext yyg->yytext_r
#define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno)
#define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column)
#define yy_flex_debug yyg->yy_flex_debug_r

int cmDependsJava_yylex_init (yyscan_t* scanner);

/* Enter a start condition.  This macro really ought to take a parameter,
 * but we do it the disgusting crufty way forced on us by the ()-less
 * definition of BEGIN.
 */
#define BEGIN yyg->yy_start = 1 + 2 *

/* Translate the current start state into a value that can be later handed
 * to BEGIN to return to the state.  The YYSTATE alias is for lex
 * compatibility.
 */
#define YY_START ((yyg->yy_start - 1) / 2)
#define YYSTATE YY_START

/* Action number for EOF rule of a given start state. */
#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1)

/* Special action meaning "start processing a new file". */
#define YY_NEW_FILE cmDependsJava_yyrestart(yyin ,yyscanner )

#define YY_END_OF_BUFFER_CHAR 0

/* Size of default input buffer. */
#ifndef YY_BUF_SIZE
#define YY_BUF_SIZE 16384
#endif

#ifndef YY_TYPEDEF_YY_BUFFER_STATE
#define YY_TYPEDEF_YY_BUFFER_STATE
typedef struct yy_buffer_state *YY_BUFFER_STATE;
#endif

#define EOB_ACT_CONTINUE_SCAN 0
#define EOB_ACT_END_OF_FILE 1
#define EOB_ACT_LAST_MATCH 2

    #define YY_LESS_LINENO(n)

/* Return all but the first "n" matched characters back to the input stream. */
#define yyless(n) \
  do \
    { \
    /* Undo effects of setting up yytext. */ \
        int yyless_macro_arg = (n); \
        YY_LESS_LINENO(yyless_macro_arg);\
    *yy_cp = yyg->yy_hold_char; \
    YY_RESTORE_YY_MORE_OFFSET \
    yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \
    YY_DO_BEFORE_ACTION; /* set up yytext again */ \
    } \
  while ( 0 )

/* The following is because we cannot portably get our hands on size_t
 * (without autoconf's help, which isn't available because we want
 * flex-generated scanners to compile on their own).
 */

#ifndef YY_TYPEDEF_YY_SIZE_T
#define YY_TYPEDEF_YY_SIZE_T
typedef unsigned int yy_size_t;
#endif

#ifndef YY_STRUCT_YY_BUFFER_STATE
#define YY_STRUCT_YY_BUFFER_STATE
struct yy_buffer_state
  {
  FILE *yy_input_file;

  char *yy_ch_buf;    /* input buffer */
  char *yy_buf_pos;    /* current position in input buffer */

  /* Size of input buffer in bytes, not including room for EOB
   * characters.
   */
  yy_size_t yy_buf_size;

  /* Number of characters read into yy_ch_buf, not including EOB
   * characters.
   */
  int yy_n_chars;

  /* Whether we "own" the buffer - i.e., we know we created it,
   * and can realloc() it to grow it, and should free() it to
   * delete it.
   */
  int yy_is_our_buffer;

  /* Whether this is an "interactive" input source; if so, and
   * if we're using stdio for input, then we want to use getc()
   * instead of fread(), to make sure we stop fetching input after
   * each newline.
   */
  int yy_is_interactive;

  /* Whether we're considered to be at the beginning of a line.
   * If so, '^' rules will be active on the next match, otherwise
   * not.
   */
  int yy_at_bol;

    int yy_bs_lineno; /**< The line count. */
    int yy_bs_column; /**< The column count. */

  /* Whether to try to fill the input buffer when we reach the
   * end of it.
   */
  int yy_fill_buffer;

  int yy_buffer_status;

#define YY_BUFFER_NEW 0
#define YY_BUFFER_NORMAL 1
  /* When an EOF's been seen but there's still some text to process
   * then we mark the buffer as YY_EOF_PENDING, to indicate that we
   * shouldn't try reading from the input source any more.  We might
   * still have a bunch of tokens to match, though, because of
   * possible backing-up.
   *
   * When we actually see the EOF, we change the status to "new"
   * (via cmDependsJava_yyrestart()), so that the user can continue scanning by
   * just pointing yyin at a new input file.
   */
#define YY_BUFFER_EOF_PENDING 2

  };
#endif /* !YY_STRUCT_YY_BUFFER_STATE */

/* We provide macros for accessing buffer states in case in the
 * future we want to put the buffer states in a more general
 * "scanner state".
 *
 * Returns the top of the stack, or NULL.
 */
#define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \
                          ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \
                          : NULL)

/* Same as previous macro, but useful when we know that the buffer stack is not
 * NULL or when we need an lvalue. For internal use only.
 */
#define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top]

void cmDependsJava_yyrestart (FILE *input_file ,yyscan_t yyscanner );
void cmDependsJava_yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
YY_BUFFER_STATE cmDependsJava_yy_create_buffer (FILE *file,int size ,yyscan_t yyscanner );
void cmDependsJava_yy_delete_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
void cmDependsJava_yy_flush_buffer (YY_BUFFER_STATE b ,yyscan_t yyscanner );
void cmDependsJava_yypush_buffer_state (YY_BUFFER_STATE new_buffer ,yyscan_t yyscanner );
void cmDependsJava_yypop_buffer_state (yyscan_t yyscanner );

static void cmDependsJava_yyensure_buffer_stack (yyscan_t yyscanner );
static void cmDependsJava_yy_load_buffer_state (yyscan_t yyscanner );
static void cmDependsJava_yy_init_buffer (YY_BUFFER_STATE b,FILE *file ,yyscan_t yyscanner );

#define YY_FLUSH_BUFFER cmDependsJava_yy_flush_buffer(YY_CURRENT_BUFFER ,yyscanner)

YY_BUFFER_STATE cmDependsJava_yy_scan_buffer (char *base,yy_size_t size ,yyscan_t yyscanner );
YY_BUFFER_STATE cmDependsJava_yy_scan_string (yyconst char *yy_str ,yyscan_t yyscanner );
YY_BUFFER_STATE cmDependsJava_yy_scan_bytes (yyconst char *bytes,int len ,yyscan_t yyscanner );

void *cmDependsJava_yyalloc (yy_size_t ,yyscan_t yyscanner );
void *cmDependsJava_yyrealloc (void *,yy_size_t ,yyscan_t yyscanner );
void cmDependsJava_yyfree (void * ,yyscan_t yyscanner );

#define yy_new_buffer cmDependsJava_yy_create_buffer

#define yy_set_interactive(is_interactive) \
  { \
  if ( ! YY_CURRENT_BUFFER ){ \
        cmDependsJava_yyensure_buffer_stack (yyscanner); \
    YY_CURRENT_BUFFER_LVALUE =    \
            cmDependsJava_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \
  } \
  YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \
  }

#define yy_set_bol(at_bol) \
  { \
  if ( ! YY_CURRENT_BUFFER ){\
        cmDependsJava_yyensure_buffer_stack (yyscanner); \
    YY_CURRENT_BUFFER_LVALUE =    \
            cmDependsJava_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner); \
  } \
  YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \
  }

#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol)

/* Begin user sect3 */

#define cmDependsJava_yywrap(n) 1
#define YY_SKIP_YYWRAP

typedef unsigned char YY_CHAR;

typedef int yy_state_type;

#define yytext_ptr yytext_r

static yy_state_type yy_get_previous_state (yyscan_t yyscanner );
static yy_state_type yy_try_NUL_trans (yy_state_type current_state  ,yyscan_t yyscanner);
static int yy_get_next_buffer (yyscan_t yyscanner );
static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner );

/* Done after the current pattern has been matched and before the
 * corresponding action - sets up yytext.
 */
#define YY_DO_BEFORE_ACTION \
  yyg->yytext_ptr = yy_bp; \
  yyleng = (size_t) (yy_cp - yy_bp); \
  yyg->yy_hold_char = *yy_cp; \
  *yy_cp = '\0'; \
  yyg->yy_c_buf_p = yy_cp;

#define YY_NUM_RULES 111
#define YY_END_OF_BUFFER 112
/* This struct is not used in this scanner,
   but its presence is necessary. */
struct yy_trans_info
  {
  flex_int32_t yy_verify;
  flex_int32_t yy_nxt;
  };
static yyconst flex_int16_t yy_accept[327] =
    {   0,
        0,    0,    0,    0,    0,    0,  112,  110,  109,  109,
       77,    4,   73,   94,   60,  110,   93,   92,  105,   99,
       68,   89,   74,   71,   56,   56,   67,  103,   86,   75,
       79,  102,  107,   64,   63,   65,  107,  107,  107,  107,
      107,  107,  107,  107,  107,  107,  107,  107,  107,  107,
      107,   70,   96,   69,  104,    3,    3,    6,  111,    5,
       78,   95,   61,   62,    0,    0,  106,  101,  100,   91,
       90,   57,    1,    0,   72,   57,   56,   57,    0,   56,
        0,   88,   87,   76,   80,   81,  107,   66,  107,  107,
      107,  107,  107,  107,  107,  107,  107,  107,   18,  107,

      107,  107,  107,  107,  107,   26,  107,  107,  107,  107,
      107,  107,  107,  107,  107,  107,  107,  107,  107,  107,
      107,  107,  107,  107,  107,   97,   98,    2,   55,   55,
        0,    0,    0,  108,   57,    0,   57,   58,   85,   82,
       83,  107,  107,  107,  107,  107,  107,  107,  107,  107,
      107,  107,  107,  107,  107,  107,  107,  107,   25,  107,
      107,   30,  107,  107,   34,  107,  107,  107,  107,  107,
      107,  107,  107,  107,  107,  107,  107,  107,  107,  107,
      107,   50,  107,  107,  107,    0,    0,   58,   84,  107,
      107,  107,  107,   11,   12,  107,   14,  107,  107,  107,

      107,   20,  107,  107,  107,  107,  107,  107,  107,  107,
       32,  107,   59,  107,  107,  107,  107,  107,  107,  107,
      107,  107,  107,  107,   46,  107,  107,   54,   51,  107,
      107,  107,  107,  107,   10,   13,   15,  107,  107,  107,
      107,   22,   24,  107,  107,  107,  107,  107,  107,  107,
      107,  107,  107,   40,  107,  107,   43,  107,  107,   47,
      107,  107,   53,  107,    8,  107,  107,  107,   19,  107,
      107,  107,   28,  107,  107,   33,  107,  107,  107,   38,
       39,   41,  107,   44,  107,   48,  107,  107,  107,    9,
      107,   17,   21,   23,  107,  107,  107,   35,   36,  107,

      107,  107,  107,  107,    7,   16,  107,  107,  107,  107,
       42,  107,  107,   52,  107,  107,   31,   37,  107,   49,
       27,   29,  107,  107,   45,    0
    } ;

static yyconst flex_int32_t yy_ec[256] =
    {   0,
        1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
        1,    2,    2,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    2,    4,    5,    1,    6,    7,    8,    9,   10,
       11,   12,   13,   14,   15,   16,   17,   18,   19,   19,
       19,   19,   19,   19,   19,   20,   20,   21,   22,   23,
       24,   25,   26,    1,   27,   27,   27,   28,   29,   28,
       30,   30,   30,   30,   30,   31,   30,   30,   30,   30,
       30,   30,   30,   30,   30,   30,   30,   32,   30,   30,
       33,   34,   35,   36,   30,    1,   37,   38,   39,   40,

       41,   42,   43,   44,   45,   30,   46,   47,   48,   49,
       50,   51,   30,   52,   53,   54,   55,   56,   57,   58,
       59,   60,   61,   62,   63,   64,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,

        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1
    } ;

static yyconst flex_int32_t yy_meta[65] =
    {   0,
        1,    1,    1,    1,    1,    1,    1,    1,    2,    1,
        1,    1,    1,    1,    1,    1,    1,    3,    3,    3,
        1,    1,    1,    1,    1,    1,    3,    3,    3,    4,
        4,    4,    1,    1,    1,    1,    3,    3,    3,    3,
        3,    3,    4,    4,    4,    4,    4,    4,    4,    4,
        4,    4,    4,    4,    4,    4,    4,    4,    4,    4,
        1,    1,    1,    1
    } ;

static yyconst flex_int16_t yy_base[334] =
    {   0,
        0,    0,  401,  400,   62,   63,  411,  414,  414,  414,
      386,  414,  414,  385,   61,  374,  414,  414,  383,   57,
      414,   56,   54,   65,   74,   43,  414,  414,   55,  382,
       59,  414,    0,  414,  414,  381,   38,   36,   60,   46,
       51,   75,   69,  354,   82,   76,  362,   85,   56,  352,
      357,  414,  100,  414,  414,  414,  383,  414,  414,  414,
      414,  414,  414,  414,  390,  127,  414,  414,  414,  414,
      414,  129,  414,  395,  414,  132,   95,  414,  165,  414,
        0,  373,  414,  414,  414,  109,    0,  414,  343,  342,
      344,  352,  338,  101,  354,  353,  340,  346,  332,  333,

      331,  337,  334,  332,  329,    0,  329,  110,  330,  324,
      320,  329,  336,   93,  336,  319,  322,   89,  320,  325,
      320,  114,  131,  120,  323,  414,  414,  414,  414,  358,
      170,  357,  362,  414,  173,  157,  176,  150,  414,  414,
      340,  309,  321,  314,  323,  318,  317,  318,  304,  302,
      300,  316,  314,  310,  309,  296,  311,  310,    0,  153,
      292,  304,  301,  298,    0,  295,  295,  284,  285,  291,
      282,  284,  281,  289,  292,  278,  292,  277,  279,  279,
      286,    0,  286,  288,  277,  189,  314,  414,  414,  270,
      269,  279,  273,    0,    0,  274,    0,  264,  271,  260,

      267,    0,  264,  271,  264,  256,  268,  256,  270,  254,
        0,  249,    0,  267,  266,  261,  256,  248,  245,  253,
      258,  244,  256,  250,    0,  236,  239,    0,    0,  237,
      249,  252,  234,  250,    0,    0,    0,  237,  238,  243,
      243,  235,    0,  233,  226,  230,  236,  236,  233,  221,
      235,  234,  223,    0,  232,  216,    0,  225,  216,  214,
      221,  220,    0,  225,    0,  214,  207,  207,    0,  207,
      200,  217,    0,  218,  219,    0,  214,  213,  199,    0,
        0,    0,  210,    0,  201,    0,  209,  202,  194,    0,
      206,    0,    0,    0,  197,  204,  205,    0,    0,  202,

      191,  192,  191,  198,    0,    0,  163,  162,  170,  170,
        0,  164,  152,    0,  152,  157,    0,    0,  127,    0,
        0,    0,  115,   95,    0,  414,  218,  222,  226,  228,
      232,   96,  235
    } ;

static yyconst flex_int16_t yy_def[334] =
    {   0,
      326,    1,  327,  327,  328,  328,  326,  326,  326,  326,
      326,  326,  326,  326,  326,  329,  326,  326,  326,  326,
      326,  326,  326,  326,  326,   25,  326,  326,  326,  326,
      326,  326,  330,  326,  326,  326,  330,  330,  330,  330,
      330,  330,  330,  330,  330,  330,  330,  330,  330,  330,
      330,  326,  326,  326,  326,  326,  326,  326,  326,  326,
      326,  326,  326,  326,  326,  329,  326,  326,  326,  326,
      326,  326,  326,  331,  326,  326,   25,  326,  326,  326,
      332,  326,  326,  326,  326,  326,  330,  326,  330,  330,
      330,  330,  330,  330,  330,  330,  330,  330,  330,  330,

      330,  330,  330,  330,  330,  330,  330,  330,  330,  330,
      330,  330,  330,  330,  330,  330,  330,  330,  330,  330,
      330,  330,  330,  330,  330,  326,  326,  326,  326,  326,
      326,  333,  331,  326,  326,  326,  326,  332,  326,  326,
      326,  330,  330,  330,  330,  330,  330,  330,  330,  330,
      330,  330,  330,  330,  330,  330,  330,  330,  330,  330,
      330,  330,  330,  330,  330,  330,  330,  330,  330,  330,
      330,  330,  330,  330,  330,  330,  330,  330,  330,  330,
      330,  330,  330,  330,  330,  326,  333,  326,  326,  330,
      330,  330,  330,  330,  330,  330,  330,  330,  330,  330,

      330,  330,  330,  330,  330,  330,  330,  330,  330,  330,
      330,  330,  330,  330,  330,  330,  330,  330,  330,  330,
      330,  330,  330,  330,  330,  330,  330,  330,  330,  330,
      330,  330,  330,  330,  330,  330,  330,  330,  330,  330,
      330,  330,  330,  330,  330,  330,  330,  330,  330,  330,
      330,  330,  330,  330,  330,  330,  330,  330,  330,  330,
      330,  330,  330,  330,  330,  330,  330,  330,  330,  330,
      330,  330,  330,  330,  330,  330,  330,  330,  330,  330,
      330,  330,  330,  330,  330,  330,  330,  330,  330,  330,
      330,  330,  330,  330,  330,  330,  330,  330,  330,  330,

      330,  330,  330,  330,  330,  330,  330,  330,  330,  330,
      330,  330,  330,  330,  330,  330,  330,  330,  330,  330,
      330,  330,  330,  330,  330,    0,  326,  326,  326,  326,
      326,  326,  326
    } ;

static yyconst flex_int16_t yy_nxt[479] =
    {   0,
        8,    9,   10,   11,   12,   13,   14,   15,   16,   17,
       18,   19,   20,   21,   22,   23,   24,   25,   26,   26,
       27,   28,   29,   30,   31,   32,   33,   33,   33,   33,
       33,   33,   34,    8,   35,   36,   37,   38,   39,   40,
       41,   42,   33,   33,   43,   33,   44,   33,   45,   33,
       46,   47,   48,   49,   33,   50,   51,   33,   33,   33,
       52,   53,   54,   55,   59,   59,   60,   60,   63,   68,
       70,   72,   72,   72,  326,   89,   73,   82,   83,   71,
       69,   74,   85,   86,   64,   91,   98,   92,   75,   76,
       90,   77,   77,   77,   93,   99,   94,  100,  138,  122,

      326,   78,   79,   95,   80,   81,   96,  123,  101,   97,
      106,  102,  113,   78,   79,   78,  107,  108,  110,  103,
       80,  104,  111,  126,  105,  173,  326,  114,  117,  326,
      115,   81,  140,  141,  325,  130,  112,  168,  118,  119,
      174,  120,  169,  121,  131,  131,   72,   72,   72,  135,
      135,  135,  326,  147,  148,  324,   78,   79,  178,   78,
       79,  127,  161,  162,  183,  179,  184,  180,   78,   79,
       78,   78,   79,   78,  137,  137,  137,  136,  129,  136,
      188,  132,  137,  137,  137,  181,  323,  186,  186,  182,
      135,  135,  135,  137,  137,  137,  188,  129,  322,  207,

       78,   79,  208,   78,  321,  320,  186,  186,  319,  318,
      317,  316,   78,   79,   78,   78,  315,   78,   56,   56,
       56,   56,   58,   58,   58,   58,   65,   65,   65,   65,
       87,   87,  133,  133,  133,  133,  187,  187,  314,  313,
      312,  311,  310,  309,  308,  307,  306,  305,  304,  303,
      302,  301,  300,  299,  298,  297,  296,  295,  294,  293,
      292,  291,  290,  289,  288,  287,  286,  285,  284,  283,
      282,  281,  280,  279,  278,  277,  276,  275,  274,  273,
      272,  271,  270,  269,  268,  267,  266,  265,  264,  263,
      262,  261,  260,  259,  258,  257,  256,  255,  254,  253,

      252,  251,  250,  249,  248,  247,  246,  245,  244,  243,
      242,  228,  241,  240,  239,  238,  237,  236,  235,  234,
      233,  232,  129,  231,  230,  229,  228,  227,  226,  225,
      224,  223,  222,  221,  220,  219,  218,  217,  216,  215,
      214,  213,  212,  211,  210,  209,  206,  205,  204,  203,
      202,  201,  200,  199,  198,  197,  196,  195,  194,  193,
      192,  191,  190,  189,  134,  129,  129,  185,  177,  176,
      175,  172,  171,  170,  167,  166,  165,  164,  163,  160,
      159,  158,  157,  156,  155,  154,  153,  152,  151,  150,
      149,  146,  145,  144,  143,  142,  139,  134,  129,  128,

      125,  124,  116,  109,   88,   84,   67,   66,   62,   61,
      326,   57,   57,    7,  326,  326,  326,  326,  326,  326,
      326,  326,  326,  326,  326,  326,  326,  326,  326,  326,
      326,  326,  326,  326,  326,  326,  326,  326,  326,  326,
      326,  326,  326,  326,  326,  326,  326,  326,  326,  326,
      326,  326,  326,  326,  326,  326,  326,  326,  326,  326,
      326,  326,  326,  326,  326,  326,  326,  326,  326,  326,
      326,  326,  326,  326,  326,  326,  326,  326
    } ;

static yyconst flex_int16_t yy_chk[479] =
    {   0,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    1,    1,    1,    1,    1,    1,
        1,    1,    1,    1,    5,    6,    5,    6,   15,   20,
       22,   23,   23,   23,   26,   37,   24,   29,   29,   22,
       20,   24,   31,   31,   15,   38,   40,   38,   24,   25,
       37,   25,   25,   25,   38,   40,   39,   41,  332,   49,

       26,   25,   25,   39,   25,   25,   39,   49,   41,   39,
       43,   42,   46,   25,   25,   25,   43,   43,   45,   42,
       25,   42,   45,   53,   42,  118,   77,   46,   48,   66,
       46,   25,   86,   86,  324,   66,   45,  114,   48,   48,
      118,   48,  114,   48,   66,   66,   72,   72,   72,   76,
       76,   76,   77,   94,   94,  323,   72,   72,  122,   76,
       76,   53,  108,  108,  124,  122,  124,  123,   72,   72,
       72,   76,   76,   76,  136,  136,  136,   79,  131,   79,
      138,   66,   79,   79,   79,  123,  319,  131,  131,  123,
      135,  135,  135,  137,  137,  137,  138,  186,  316,  160,

      135,  135,  160,  137,  315,  313,  186,  186,  312,  310,
      309,  308,  135,  135,  135,  137,  307,  137,  327,  327,
      327,  327,  328,  328,  328,  328,  329,  329,  329,  329,
      330,  330,  331,  331,  331,  331,  333,  333,  304,  303,
      302,  301,  300,  297,  296,  295,  291,  289,  288,  287,
      285,  283,  279,  278,  277,  275,  274,  272,  271,  270,
      268,  267,  266,  264,  262,  261,  260,  259,  258,  256,
      255,  253,  252,  251,  250,  249,  248,  247,  246,  245,
      244,  242,  241,  240,  239,  238,  234,  233,  232,  231,
      230,  227,  226,  224,  223,  222,  221,  220,  219,  218,

      217,  216,  215,  214,  212,  210,  209,  208,  207,  206,
      205,  204,  203,  201,  200,  199,  198,  196,  193,  192,
      191,  190,  187,  185,  184,  183,  181,  180,  179,  178,
      177,  176,  175,  174,  173,  172,  171,  170,  169,  168,
      167,  166,  164,  163,  162,  161,  158,  157,  156,  155,
      154,  153,  152,  151,  150,  149,  148,  147,  146,  145,
      144,  143,  142,  141,  133,  132,  130,  125,  121,  120,
      119,  117,  116,  115,  113,  112,  111,  110,  109,  107,
      105,  104,  103,  102,  101,  100,   99,   98,   97,   96,
       95,   93,   92,   91,   90,   89,   82,   74,   65,   57,

       51,   50,   47,   44,   36,   30,   19,   16,   14,   11,
        7,    4,    3,  326,  326,  326,  326,  326,  326,  326,
      326,  326,  326,  326,  326,  326,  326,  326,  326,  326,
      326,  326,  326,  326,  326,  326,  326,  326,  326,  326,
      326,  326,  326,  326,  326,  326,  326,  326,  326,  326,
      326,  326,  326,  326,  326,  326,  326,  326,  326,  326,
      326,  326,  326,  326,  326,  326,  326,  326,  326,  326,
      326,  326,  326,  326,  326,  326,  326,  326
    } ;

/* The intent behind this definition is that it'll catch
 * any uses of REJECT which flex missed.
 */
#define REJECT reject_used_but_not_detected
#define yymore() yymore_used_but_not_detected
#define YY_MORE_ADJ 0
#define YY_RESTORE_YY_MORE_OFFSET
#line 1 "cmDependsJavaLexer.in.l"
#line 2 "cmDependsJavaLexer.in.l"
/* Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
   file Copyright.txt or https://cmake.org/licensing for details.  */
/*

This file must be translated to C and modified to build everywhere.

Run flex like this:

  flex --prefix=cmDependsJava_yy --header-file=cmDependsJavaLexer.h -ocmDependsJavaLexer.cxx cmDependsJavaLexer.in.l

Modify cmDependsJavaLexer.c:
  - remove TABs
  - remove "yyscanner" argument from these methods:
      yy_fatal_error, cmDependsJava_yyalloc, cmDependsJava_yyrealloc, cmDependsJava_yyfree
  - remove all YY_BREAK lines occurring right after return statements
  - change while ( 1 ) to for(;;)

Modify cmDependsJavaLexer.h:
  - remove TABs
  - remove the yy_init_globals function
  - remove the block that includes unistd.h
  - remove #line directives (avoids bogus warning on old Sun)

*/

#include "cmStandardLexer.h"

#include "cmDependsJavaParserHelper.h"

/* Replace the lexer input function.  */
#undef YY_INPUT
#define YY_INPUT(buf, result, max_size) \
  { result = yyextra->LexInput(buf, max_size); }

/* Include the set of tokens from the parser.  */
#include "cmDependsJavaParserTokens.h"

#define KEYWORD yylvalp->str = 0
#define SYMBOL yylvalp->str = 0
#define PRIMITIVE  yylvalp->str = 0

/*--------------------------------------------------------------------------*/


#line 721 "cmDependsJavaLexer.cxx"

#define INITIAL 0
#define comment 1
#define string 2

#ifndef YY_NO_UNISTD_H
/* Special case for "unistd.h", since it is non-ANSI. We include it way
 * down here because we want the user's section 1 to have been scanned first.
 * The user has a chance to override it with an option.
 */
#include <unistd.h>
#endif

#ifndef YY_EXTRA_TYPE
#define YY_EXTRA_TYPE void *
#endif

/* Holds the entire state of the reentrant scanner. */
struct yyguts_t
    {

    /* User-defined. Not touched by flex. */
    YY_EXTRA_TYPE yyextra_r;

    /* The rest are the same as the globals declared in the non-reentrant scanner. */
    FILE *yyin_r, *yyout_r;
    size_t yy_buffer_stack_top; /**< index of top of stack. */
    size_t yy_buffer_stack_max; /**< capacity of stack. */
    YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */
    char yy_hold_char;
    int yy_n_chars;
    int yyleng_r;
    char *yy_c_buf_p;
    int yy_init;
    int yy_start;
    int yy_did_buffer_switch_on_eof;
    int yy_start_stack_ptr;
    int yy_start_stack_depth;
    int *yy_start_stack;
    yy_state_type yy_last_accepting_state;
    char* yy_last_accepting_cpos;

    int yylineno_r;
    int yy_flex_debug_r;

    char *yytext_r;
    int yy_more_flag;
    int yy_more_len;

    }; /* end struct yyguts_t */

/* Accessor methods to globals.
   These are made visible to non-reentrant scanners for convenience. */

int cmDependsJava_yylex_destroy (yyscan_t yyscanner );

int cmDependsJava_yyget_debug (yyscan_t yyscanner );

void cmDependsJava_yyset_debug (int debug_flag ,yyscan_t yyscanner );

YY_EXTRA_TYPE cmDependsJava_yyget_extra (yyscan_t yyscanner );

void cmDependsJava_yyset_extra (YY_EXTRA_TYPE user_defined ,yyscan_t yyscanner );

FILE *cmDependsJava_yyget_in (yyscan_t yyscanner );

void cmDependsJava_yyset_in  (FILE * in_str ,yyscan_t yyscanner );

FILE *cmDependsJava_yyget_out (yyscan_t yyscanner );

void cmDependsJava_yyset_out  (FILE * out_str ,yyscan_t yyscanner );

int cmDependsJava_yyget_leng (yyscan_t yyscanner );

char *cmDependsJava_yyget_text (yyscan_t yyscanner );

int cmDependsJava_yyget_lineno (yyscan_t yyscanner );

void cmDependsJava_yyset_lineno (int line_number ,yyscan_t yyscanner );

/* Macros after this point can all be overridden by user definitions in
 * section 1.
 */

#ifndef YY_SKIP_YYWRAP
#ifdef __cplusplus
extern "C" int cmDependsJava_yywrap (yyscan_t yyscanner );
#else
extern int cmDependsJava_yywrap (yyscan_t yyscanner );
#endif
#endif

#ifndef yytext_ptr
static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner);
#endif

#ifdef YY_NEED_STRLEN
static int yy_flex_strlen (yyconst char * ,yyscan_t yyscanner);
#endif

#ifndef YY_NO_INPUT

#ifdef __cplusplus
static int yyinput (yyscan_t yyscanner );
#else
static int input (yyscan_t yyscanner );
#endif

#endif

/* Amount of stuff to slurp up with each read. */
#ifndef YY_READ_BUF_SIZE
#define YY_READ_BUF_SIZE 8192
#endif

/* Copy whatever the last rule matched to the standard output. */
#ifndef ECHO
/* This used to be an fputs(), but since the string might contain NUL's,
 * we now use fwrite().
 */
#define ECHO (void) fwrite( yytext, yyleng, 1, yyout )
#endif

/* Gets input and stuffs it into "buf".  number of characters read, or YY_NULL,
 * is returned in "result".
 */
#ifndef YY_INPUT
#define YY_INPUT(buf,result,max_size) \
  if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \
    { \
    int c = '*'; \
    size_t n; \
    for ( n = 0; n < max_size && \
           (c = getc( yyin )) != EOF && c != '\n'; ++n ) \
      buf[n] = (char) c; \
    if ( c == '\n' ) \
      buf[n++] = (char) c; \
    if ( c == EOF && ferror( yyin ) ) \
      YY_FATAL_ERROR( "input in flex scanner failed" ); \
    result = n; \
    } \
  else \
    { \
    errno=0; \
    while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \
      { \
      if( errno != EINTR) \
        { \
        YY_FATAL_ERROR( "input in flex scanner failed" ); \
        break; \
        } \
      errno=0; \
      clearerr(yyin); \
      } \
    }\
\

#endif

/* No semi-colon after return; correct usage is to write "yyterminate();" -
 * we don't want an extra ';' after the "return" because that will cause
 * some compilers to complain about unreachable statements.
 */
#ifndef yyterminate
#define yyterminate() return YY_NULL
#endif

/* Number of entries by which start-condition stack grows. */
#ifndef YY_START_STACK_INCR
#define YY_START_STACK_INCR 25
#endif

/* Report a fatal error. */
#ifndef YY_FATAL_ERROR
#define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner)
#endif

/* end tables serialization structures and prototypes */

/* Default declaration of generated scanner - a define so the user can
 * easily add parameters.
 */
#ifndef YY_DECL
#define YY_DECL_IS_OURS 1

extern int cmDependsJava_yylex (yyscan_t yyscanner);

#define YY_DECL int cmDependsJava_yylex (yyscan_t yyscanner)
#endif /* !YY_DECL */

/* Code executed at the beginning of each rule, after yytext and yyleng
 * have been set up.
 */
#ifndef YY_USER_ACTION
#define YY_USER_ACTION
#endif

/* Code executed at the end of each rule. */
#ifndef YY_BREAK
#define YY_BREAK break;
#endif

#define YY_RULE_SETUP \
  YY_USER_ACTION

/** The main scanner function which does all the work.
 */
YY_DECL
{
  yy_state_type yy_current_state;
  char *yy_cp, *yy_bp;
  int yy_act;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

#line 88 "cmDependsJavaLexer.in.l"

#line 940 "cmDependsJavaLexer.cxx"

  if ( yyg->yy_init )
    {
    yyg->yy_init = 0;

#ifdef YY_USER_INIT
    YY_USER_INIT;
#endif

    if ( ! yyg->yy_start )
      yyg->yy_start = 1;  /* first start state */

    if ( ! yyin )
      yyin = stdin;

    if ( ! yyout )
      yyout = stdout;

    if ( ! YY_CURRENT_BUFFER ) {
      cmDependsJava_yyensure_buffer_stack (yyscanner);
      YY_CURRENT_BUFFER_LVALUE =
        cmDependsJava_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
    }

    cmDependsJava_yy_load_buffer_state(yyscanner );
    }

  for(;;)    /* loops until end-of-file is reached */
    {
    yy_cp = yyg->yy_c_buf_p;

    /* Support of yytext. */
    *yy_cp = yyg->yy_hold_char;

    /* yy_bp points to the position in yy_ch_buf of the start of
     * the current run.
     */
    yy_bp = yy_cp;

    yy_current_state = yyg->yy_start;
yy_match:
    do
      {
      YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
      if ( yy_accept[yy_current_state] )
        {
        yyg->yy_last_accepting_state = yy_current_state;
        yyg->yy_last_accepting_cpos = yy_cp;
        }
      while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
        {
        yy_current_state = (int) yy_def[yy_current_state];
        if ( yy_current_state >= 327 )
          yy_c = yy_meta[(unsigned int) yy_c];
        }
      yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
      ++yy_cp;
      }
    while ( yy_base[yy_current_state] != 414 );

yy_find_action:
    yy_act = yy_accept[yy_current_state];
    if ( yy_act == 0 )
      { /* have to back up */
      yy_cp = yyg->yy_last_accepting_cpos;
      yy_current_state = yyg->yy_last_accepting_state;
      yy_act = yy_accept[yy_current_state];
      }

    YY_DO_BEFORE_ACTION;

do_action:  /* This label is used only to access EOF actions. */

    switch ( yy_act )
  { /* beginning of action switch */
      case 0: /* must back up */
      /* undo the effects of YY_DO_BEFORE_ACTION */
      *yy_cp = yyg->yy_hold_char;
      yy_cp = yyg->yy_last_accepting_cpos;
      yy_current_state = yyg->yy_last_accepting_state;
      goto yy_find_action;

case 1:
YY_RULE_SETUP
#line 89 "cmDependsJavaLexer.in.l"
{ BEGIN(comment); }
  YY_BREAK
case 2:
YY_RULE_SETUP
#line 90 "cmDependsJavaLexer.in.l"
{ BEGIN(INITIAL); }
  YY_BREAK
case 3:
/* rule 3 can match eol */
YY_RULE_SETUP
#line 91 "cmDependsJavaLexer.in.l"
{}
  YY_BREAK
case 4:
YY_RULE_SETUP
#line 93 "cmDependsJavaLexer.in.l"
{ BEGIN(string); }
  YY_BREAK
case 5:
YY_RULE_SETUP
#line 94 "cmDependsJavaLexer.in.l"
{ BEGIN(INITIAL); return jp_STRINGLITERAL; }
case 6:
YY_RULE_SETUP
#line 95 "cmDependsJavaLexer.in.l"
{}
  YY_BREAK
case 7:
YY_RULE_SETUP
#line 97 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_ABSTRACT; }
case 8:
YY_RULE_SETUP
#line 98 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_ASSERT; }
case 9:
YY_RULE_SETUP
#line 99 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_BOOLEAN_TYPE; }
case 10:
YY_RULE_SETUP
#line 100 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_BREAK; }
case 11:
YY_RULE_SETUP
#line 101 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_BYTE_TYPE; }
case 12:
YY_RULE_SETUP
#line 102 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_CASE; }
case 13:
YY_RULE_SETUP
#line 103 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_CATCH; }
case 14:
YY_RULE_SETUP
#line 104 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_CHAR_TYPE; }
case 15:
YY_RULE_SETUP
#line 105 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_CLASS; }
case 16:
YY_RULE_SETUP
#line 106 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_CONTINUE; }
case 17:
YY_RULE_SETUP
#line 107 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_DEFAULT; }
case 18:
YY_RULE_SETUP
#line 108 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_DO; }
case 19:
YY_RULE_SETUP
#line 109 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_DOUBLE_TYPE; }
case 20:
YY_RULE_SETUP
#line 110 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_ELSE; }
case 21:
YY_RULE_SETUP
#line 111 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_EXTENDS; }
case 22:
YY_RULE_SETUP
#line 112 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_FINAL; }
case 23:
YY_RULE_SETUP
#line 113 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_FINALLY; }
case 24:
YY_RULE_SETUP
#line 114 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_FLOAT_TYPE; }
case 25:
YY_RULE_SETUP
#line 115 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_FOR; }
case 26:
YY_RULE_SETUP
#line 116 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_IF; }
case 27:
YY_RULE_SETUP
#line 117 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_IMPLEMENTS; }
case 28:
YY_RULE_SETUP
#line 118 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_IMPORT; }
case 29:
YY_RULE_SETUP
#line 119 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_INSTANCEOF; }
case 30:
YY_RULE_SETUP
#line 120 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_INT_TYPE; }
case 31:
YY_RULE_SETUP
#line 121 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_INTERFACE; }
case 32:
YY_RULE_SETUP
#line 122 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_LONG_TYPE; }
case 33:
YY_RULE_SETUP
#line 123 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_NATIVE; }
case 34:
YY_RULE_SETUP
#line 124 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_NEW; }
case 35:
YY_RULE_SETUP
#line 125 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_PACKAGE; }
case 36:
YY_RULE_SETUP
#line 126 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_PRIVATE; }
case 37:
YY_RULE_SETUP
#line 127 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_PROTECTED; }
case 38:
YY_RULE_SETUP
#line 128 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_PUBLIC; }
case 39:
YY_RULE_SETUP
#line 129 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_RETURN; }
case 40:
YY_RULE_SETUP
#line 130 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_SHORT_TYPE; }
case 41:
YY_RULE_SETUP
#line 131 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_STATIC; }
case 42:
YY_RULE_SETUP
#line 132 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_STRICTFP; }
case 43:
YY_RULE_SETUP
#line 133 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_SUPER; }
case 44:
YY_RULE_SETUP
#line 134 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_SWITCH; }
case 45:
YY_RULE_SETUP
#line 135 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_SYNCHRONIZED; }
case 46:
YY_RULE_SETUP
#line 136 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_THIS; }
case 47:
YY_RULE_SETUP
#line 137 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_THROW; }
case 48:
YY_RULE_SETUP
#line 138 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_THROWS; }
case 49:
YY_RULE_SETUP
#line 139 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_TRANSIENT; }
case 50:
YY_RULE_SETUP
#line 140 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_TRY; }
case 51:
YY_RULE_SETUP
#line 141 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_VOID; }
case 52:
YY_RULE_SETUP
#line 142 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_VOLATILE; }
case 53:
YY_RULE_SETUP
#line 143 "cmDependsJavaLexer.in.l"
{ KEYWORD; return jp_WHILE; }
case 54:
YY_RULE_SETUP
#line 145 "cmDependsJavaLexer.in.l"
{ PRIMITIVE; return jp_BOOLEANLITERAL; }
case 55:
/* rule 55 can match eol */
YY_RULE_SETUP
#line 146 "cmDependsJavaLexer.in.l"
{ PRIMITIVE; return jp_CHARACTERLITERAL; }
case 56:
YY_RULE_SETUP
#line 147 "cmDependsJavaLexer.in.l"
{ PRIMITIVE; return jp_DECIMALINTEGERLITERAL; }
case 57:
YY_RULE_SETUP
#line 148 "cmDependsJavaLexer.in.l"
{ PRIMITIVE; return jp_FLOATINGPOINTLITERAL; }
case 58:
YY_RULE_SETUP
#line 149 "cmDependsJavaLexer.in.l"
{ PRIMITIVE; return jp_HEXINTEGERLITERAL; }
case 59:
YY_RULE_SETUP
#line 150 "cmDependsJavaLexer.in.l"
{ PRIMITIVE; return jp_NULLLITERAL; }
case 60:
YY_RULE_SETUP
#line 152 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_AND; }
case 61:
YY_RULE_SETUP
#line 153 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_ANDAND; }
case 62:
YY_RULE_SETUP
#line 154 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_ANDEQUALS; }
case 63:
YY_RULE_SETUP
#line 155 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_BRACKETEND; }
case 64:
YY_RULE_SETUP
#line 156 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_BRACKETSTART; }
case 65:
YY_RULE_SETUP
#line 157 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_CARROT; }
case 66:
YY_RULE_SETUP
#line 158 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_CARROTEQUALS; }
case 67:
YY_RULE_SETUP
#line 159 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_COLON; }
case 68:
YY_RULE_SETUP
#line 160 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_COMMA; }
case 69:
YY_RULE_SETUP
#line 161 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_CURLYEND; }
case 70:
YY_RULE_SETUP
#line 162 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_CURLYSTART; }
case 71:
YY_RULE_SETUP
#line 163 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_DIVIDE; }
case 72:
YY_RULE_SETUP
#line 164 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_DIVIDEEQUALS; }
case 73:
YY_RULE_SETUP
#line 165 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_DOLLAR; }
case 74:
YY_RULE_SETUP
#line 166 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_DOT; }
case 75:
YY_RULE_SETUP
#line 167 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_EQUALS; }
case 76:
YY_RULE_SETUP
#line 168 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_EQUALSEQUALS; }
case 77:
YY_RULE_SETUP
#line 169 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_EXCLAMATION; }
case 78:
YY_RULE_SETUP
#line 170 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_EXCLAMATIONEQUALS; }
case 79:
YY_RULE_SETUP
#line 171 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_GREATER; }
case 80:
YY_RULE_SETUP
#line 172 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_GTEQUALS; }
case 81:
YY_RULE_SETUP
#line 173 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_GTGT; }
case 82:
YY_RULE_SETUP
#line 174 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_GTGTEQUALS; }
case 83:
YY_RULE_SETUP
#line 175 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_GTGTGT; }
case 84:
YY_RULE_SETUP
#line 176 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_GTGTGTEQUALS; }
case 85:
YY_RULE_SETUP
#line 177 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_LESLESEQUALS; }
case 86:
YY_RULE_SETUP
#line 178 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_LESSTHAN; }
case 87:
YY_RULE_SETUP
#line 179 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_LTEQUALS; }
case 88:
YY_RULE_SETUP
#line 180 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_LTLT; }
case 89:
YY_RULE_SETUP
#line 181 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_MINUS; }
case 90:
YY_RULE_SETUP
#line 182 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_MINUSEQUALS; }
case 91:
YY_RULE_SETUP
#line 183 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_MINUSMINUS; }
case 92:
YY_RULE_SETUP
#line 184 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_PAREEND; }
case 93:
YY_RULE_SETUP
#line 185 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_PARESTART; }
case 94:
YY_RULE_SETUP
#line 186 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_PERCENT; }
case 95:
YY_RULE_SETUP
#line 187 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_PERCENTEQUALS; }
case 96:
YY_RULE_SETUP
#line 188 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_PIPE; }
case 97:
YY_RULE_SETUP
#line 189 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_PIPEEQUALS; }
case 98:
YY_RULE_SETUP
#line 190 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_PIPEPIPE; }
case 99:
YY_RULE_SETUP
#line 191 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_PLUS; }
case 100:
YY_RULE_SETUP
#line 192 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_PLUSEQUALS; }
case 101:
YY_RULE_SETUP
#line 193 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_PLUSPLUS; }
case 102:
YY_RULE_SETUP
#line 194 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_QUESTION; }
case 103:
YY_RULE_SETUP
#line 195 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_SEMICOL; }
case 104:
YY_RULE_SETUP
#line 196 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_TILDE; }
case 105:
YY_RULE_SETUP
#line 197 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_TIMES; }
case 106:
YY_RULE_SETUP
#line 198 "cmDependsJavaLexer.in.l"
{ SYMBOL; return jp_TIMESEQUALS; }
case 107:
YY_RULE_SETUP
#line 200 "cmDependsJavaLexer.in.l"
{
  yyextra->AllocateParserType(yylvalp, yytext, strlen(yytext));
  return jp_NAME;
}
case 108:
/* rule 108 can match eol */
YY_RULE_SETUP
#line 205 "cmDependsJavaLexer.in.l"
{ }
  YY_BREAK
case 109:
/* rule 109 can match eol */
YY_RULE_SETUP
#line 206 "cmDependsJavaLexer.in.l"
{ }
  YY_BREAK
case 110:
YY_RULE_SETUP
#line 207 "cmDependsJavaLexer.in.l"
{
  std::cerr << "Unknown character: " << yytext[0]
    << " (" << (int)yytext[0] << ")" << std::endl;
  yyextra->Error("Unknown character");
  return jp_ERROR;
}
case 111:
YY_RULE_SETUP
#line 214 "cmDependsJavaLexer.in.l"
ECHO;
  YY_BREAK
#line 1590 "cmDependsJavaLexer.cxx"
case YY_STATE_EOF(INITIAL):
case YY_STATE_EOF(comment):
case YY_STATE_EOF(string):
  yyterminate();

  case YY_END_OF_BUFFER:
    {
    /* Amount of text matched not including the EOB char. */
    int yy_amount_of_matched_text = (int) (yy_cp - yyg->yytext_ptr) - 1;

    /* Undo the effects of YY_DO_BEFORE_ACTION. */
    *yy_cp = yyg->yy_hold_char;
    YY_RESTORE_YY_MORE_OFFSET

    if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW )
      {
      /* We're scanning a new file or input source.  It's
       * possible that this happened because the user
       * just pointed yyin at a new source and called
       * cmDependsJava_yylex().  If so, then we have to assure
       * consistency between YY_CURRENT_BUFFER and our
       * globals.  Here is the right place to do so, because
       * this is the first action (other than possibly a
       * back-up) that will match for the new input source.
       */
      yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
      YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin;
      YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL;
      }

    /* Note that here we test for yy_c_buf_p "<=" to the position
     * of the first EOB in the buffer, since yy_c_buf_p will
     * already have been incremented past the NUL character
     * (since all states make transitions on EOB to the
     * end-of-buffer state).  Contrast this with the test
     * in input().
     */
    if ( yyg->yy_c_buf_p <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
      { /* This was really a NUL. */
      yy_state_type yy_next_state;

      yyg->yy_c_buf_p = yyg->yytext_ptr + yy_amount_of_matched_text;

      yy_current_state = yy_get_previous_state( yyscanner );

      /* Okay, we're now positioned to make the NUL
       * transition.  We couldn't have
       * yy_get_previous_state() go ahead and do it
       * for us because it doesn't know how to deal
       * with the possibility of jamming (and we don't
       * want to build jamming into it because then it
       * will run more slowly).
       */

      yy_next_state = yy_try_NUL_trans( yy_current_state , yyscanner);

      yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;

      if ( yy_next_state )
        {
        /* Consume the NUL. */
        yy_cp = ++yyg->yy_c_buf_p;
        yy_current_state = yy_next_state;
        goto yy_match;
        }

      else
        {
        yy_cp = yyg->yy_c_buf_p;
        goto yy_find_action;
        }
      }

    else switch ( yy_get_next_buffer( yyscanner ) )
      {
      case EOB_ACT_END_OF_FILE:
        {
        yyg->yy_did_buffer_switch_on_eof = 0;

        if ( cmDependsJava_yywrap(yyscanner ) )
          {
          /* Note: because we've taken care in
           * yy_get_next_buffer() to have set up
           * yytext, we can now set up
           * yy_c_buf_p so that if some total
           * hoser (like flex itself) wants to
           * call the scanner after we return the
           * YY_NULL, it'll still work - another
           * YY_NULL will get returned.
           */
          yyg->yy_c_buf_p = yyg->yytext_ptr + YY_MORE_ADJ;

          yy_act = YY_STATE_EOF(YY_START);
          goto do_action;
          }

        else
          {
          if ( ! yyg->yy_did_buffer_switch_on_eof )
            YY_NEW_FILE;
          }
        break;
        }

      case EOB_ACT_CONTINUE_SCAN:
        yyg->yy_c_buf_p =
          yyg->yytext_ptr + yy_amount_of_matched_text;

        yy_current_state = yy_get_previous_state( yyscanner );

        yy_cp = yyg->yy_c_buf_p;
        yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
        goto yy_match;

      case EOB_ACT_LAST_MATCH:
        yyg->yy_c_buf_p =
        &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars];

        yy_current_state = yy_get_previous_state( yyscanner );

        yy_cp = yyg->yy_c_buf_p;
        yy_bp = yyg->yytext_ptr + YY_MORE_ADJ;
        goto yy_find_action;
      }
    break;
    }

  default:
    YY_FATAL_ERROR(
      "fatal flex scanner internal error--no action found" );
  } /* end of action switch */
    } /* end of scanning one token */
return 0; /* this should not happen but it quiets some compilers */
} /* end of cmDependsJava_yylex */

/* yy_get_next_buffer - try to read in a new buffer
 *
 * Returns a code representing an action:
 *  EOB_ACT_LAST_MATCH -
 *  EOB_ACT_CONTINUE_SCAN - continue scanning from current position
 *  EOB_ACT_END_OF_FILE - end of file
 */
static int yy_get_next_buffer (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
  char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
  char *source = yyg->yytext_ptr;
  int number_to_move, i;
  int ret_val;

  if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] )
    YY_FATAL_ERROR(
    "fatal flex scanner internal error--end of buffer missed" );

  if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 )
    { /* Don't try to fill the buffer, so this is an EOF. */
    if ( yyg->yy_c_buf_p - yyg->yytext_ptr - YY_MORE_ADJ == 1 )
      {
      /* We matched a single character, the EOB, so
       * treat this as a final EOF.
       */
      return EOB_ACT_END_OF_FILE;
      }

    else
      {
      /* We matched some text prior to the EOB, first
       * process it.
       */
      return EOB_ACT_LAST_MATCH;
      }
    }

  /* Try to read more data. */

  /* First move last chars to start of buffer. */
  number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1;

  for ( i = 0; i < number_to_move; ++i )
    *(dest++) = *(source++);

  if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING )
    /* don't do the read, it's not guaranteed to return an EOF,
     * just force an EOF
     */
    YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars = 0;

  else
    {
      size_t nuto_read =
      YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1;

    while ( nuto_read <= 0 )
      { /* Not enough room in the buffer - grow it. */

      /* just a shorter name for the current buffer */
      YY_BUFFER_STATE b = YY_CURRENT_BUFFER;

      int yy_c_buf_p_offset =
        (int) (yyg->yy_c_buf_p - b->yy_ch_buf);

      if ( b->yy_is_our_buffer )
        {
        int new_size = b->yy_buf_size * 2;

        if ( new_size <= 0 )
          b->yy_buf_size += b->yy_buf_size / 8;
        else
          b->yy_buf_size *= 2;

        b->yy_ch_buf = (char *)
          /* Include room in for 2 EOB chars. */
          cmDependsJava_yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ,yyscanner );
        }
      else
        /* Can't grow it, we don't own it. */
        b->yy_ch_buf = 0;

      if ( ! b->yy_ch_buf )
        YY_FATAL_ERROR(
        "fatal error - scanner input buffer overflow" );

      yyg->yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset];

      nuto_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size -
            number_to_move - 1;

      }

    if ( nuto_read > YY_READ_BUF_SIZE )
      nuto_read = YY_READ_BUF_SIZE;

    /* Read in more data. */
    YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
      yyg->yy_n_chars, nuto_read );

    YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
    }

  if ( yyg->yy_n_chars == 0 )
    {
    if ( number_to_move == YY_MORE_ADJ )
      {
      ret_val = EOB_ACT_END_OF_FILE;
      cmDependsJava_yyrestart(yyin  ,yyscanner);
      }

    else
      {
      ret_val = EOB_ACT_LAST_MATCH;
      YY_CURRENT_BUFFER_LVALUE->yy_buffer_status =
        YY_BUFFER_EOF_PENDING;
      }
    }

  else
    ret_val = EOB_ACT_CONTINUE_SCAN;

  yyg->yy_n_chars += number_to_move;
  YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] = YY_END_OF_BUFFER_CHAR;
  YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR;

  yyg->yytext_ptr = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0];

  return ret_val;
}

/* yy_get_previous_state - get the state just before the EOB char was reached */

    static yy_state_type yy_get_previous_state (yyscan_t yyscanner)
{
  yy_state_type yy_current_state;
  char *yy_cp;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

  yy_current_state = yyg->yy_start;

  for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp )
    {
    YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
    if ( yy_accept[yy_current_state] )
      {
      yyg->yy_last_accepting_state = yy_current_state;
      yyg->yy_last_accepting_cpos = yy_cp;
      }
    while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
      {
      yy_current_state = (int) yy_def[yy_current_state];
      if ( yy_current_state >= 327 )
        yy_c = yy_meta[(unsigned int) yy_c];
      }
    yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
    }

  return yy_current_state;
}

/* yy_try_NUL_trans - try to make a transition on the NUL character
 *
 * synopsis
 *  next_state = yy_try_NUL_trans( current_state );
 */
    static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state , yyscan_t yyscanner)
{
  int yy_is_jam;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
  char *yy_cp = yyg->yy_c_buf_p;

  YY_CHAR yy_c = 1;
  if ( yy_accept[yy_current_state] )
    {
    yyg->yy_last_accepting_state = yy_current_state;
    yyg->yy_last_accepting_cpos = yy_cp;
    }
  while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
    {
    yy_current_state = (int) yy_def[yy_current_state];
    if ( yy_current_state >= 327 )
      yy_c = yy_meta[(unsigned int) yy_c];
    }
  yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c];
  yy_is_jam = (yy_current_state == 326);

  return yy_is_jam ? 0 : yy_current_state;
}

#ifndef YY_NO_INPUT
#ifdef __cplusplus
    static int yyinput (yyscan_t yyscanner)
#else
    static int input  (yyscan_t yyscanner)
#endif

{
  int c;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

  *yyg->yy_c_buf_p = yyg->yy_hold_char;

  if ( *yyg->yy_c_buf_p == YY_END_OF_BUFFER_CHAR )
    {
    /* yy_c_buf_p now points to the character we want to return.
     * If this occurs *before* the EOB characters, then it's a
     * valid NUL; if not, then we've hit the end of the buffer.
     */
    if ( yyg->yy_c_buf_p < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars] )
      /* This was really a NUL. */
      *yyg->yy_c_buf_p = '\0';

    else
      { /* need more input */
      int offset = yyg->yy_c_buf_p - yyg->yytext_ptr;
      ++yyg->yy_c_buf_p;

      switch ( yy_get_next_buffer( yyscanner ) )
        {
        case EOB_ACT_LAST_MATCH:
          /* This happens because yy_g_n_b()
           * sees that we've accumulated a
           * token and flags that we need to
           * try matching the token before
           * proceeding.  But for input(),
           * there's no matching to consider.
           * So convert the EOB_ACT_LAST_MATCH
           * to EOB_ACT_END_OF_FILE.
           */

          /* Reset buffer status. */
          cmDependsJava_yyrestart(yyin ,yyscanner);

          /*FALLTHROUGH*/

        case EOB_ACT_END_OF_FILE:
          {
          if ( cmDependsJava_yywrap(yyscanner ) )
            return EOF;

          if ( ! yyg->yy_did_buffer_switch_on_eof )
            YY_NEW_FILE;
#ifdef __cplusplus
          return yyinput(yyscanner);
#else
          return input(yyscanner);
#endif
          }

        case EOB_ACT_CONTINUE_SCAN:
          yyg->yy_c_buf_p = yyg->yytext_ptr + offset;
          break;
        }
      }
    }

  c = *(unsigned char *) yyg->yy_c_buf_p;  /* cast for 8-bit char's */
  *yyg->yy_c_buf_p = '\0';  /* preserve yytext */
  yyg->yy_hold_char = *++yyg->yy_c_buf_p;

  return c;
}
#endif  /* ifndef YY_NO_INPUT */

/** Immediately switch to a different input stream.
 * @param input_file A readable stream.
 * @param yyscanner The scanner object.
 * @note This function does not reset the start condition to @c INITIAL .
 */
    void cmDependsJava_yyrestart  (FILE * input_file , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

  if ( ! YY_CURRENT_BUFFER ){
        cmDependsJava_yyensure_buffer_stack (yyscanner);
    YY_CURRENT_BUFFER_LVALUE =
            cmDependsJava_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
  }

  cmDependsJava_yy_init_buffer(YY_CURRENT_BUFFER,input_file ,yyscanner);
  cmDependsJava_yy_load_buffer_state(yyscanner );
}

/** Switch to a different input buffer.
 * @param new_buffer The new input buffer.
 * @param yyscanner The scanner object.
 */
    void cmDependsJava_yy_switch_to_buffer  (YY_BUFFER_STATE  new_buffer , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

  /* TODO. We should be able to replace this entire function body
   * with
   *    cmDependsJava_yypop_buffer_state();
   *    cmDependsJava_yypush_buffer_state(new_buffer);
     */
  cmDependsJava_yyensure_buffer_stack (yyscanner);
  if ( YY_CURRENT_BUFFER == new_buffer )
    return;

  if ( YY_CURRENT_BUFFER )
    {
    /* Flush out information for old buffer. */
    *yyg->yy_c_buf_p = yyg->yy_hold_char;
    YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
    YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
    }

  YY_CURRENT_BUFFER_LVALUE = new_buffer;
  cmDependsJava_yy_load_buffer_state(yyscanner );

  /* We don't actually know whether we did this switch during
   * EOF (cmDependsJava_yywrap()) processing, but the only time this flag
   * is looked at is after cmDependsJava_yywrap() is called, so it's safe
   * to go ahead and always set it.
   */
  yyg->yy_did_buffer_switch_on_eof = 1;
}

static void cmDependsJava_yy_load_buffer_state  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
  yyg->yy_n_chars = YY_CURRENT_BUFFER_LVALUE->yy_n_chars;
  yyg->yytext_ptr = yyg->yy_c_buf_p = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos;
  yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file;
  yyg->yy_hold_char = *yyg->yy_c_buf_p;
}

/** Allocate and initialize an input buffer state.
 * @param file A readable stream.
 * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE.
 * @param yyscanner The scanner object.
 * @return the allocated buffer state.
 */
    YY_BUFFER_STATE cmDependsJava_yy_create_buffer  (FILE * file, int  size , yyscan_t yyscanner)
{
  YY_BUFFER_STATE b;

  b = (YY_BUFFER_STATE) cmDependsJava_yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner );
  if ( ! b )
    YY_FATAL_ERROR( "out of dynamic memory in cmDependsJava_yy_create_buffer()" );

  b->yy_buf_size = size;

  /* yy_ch_buf has to be 2 characters longer than the size given because
   * we need to put in 2 end-of-buffer characters.
   */
  b->yy_ch_buf = (char *) cmDependsJava_yyalloc(b->yy_buf_size + 2 ,yyscanner );
  if ( ! b->yy_ch_buf )
    YY_FATAL_ERROR( "out of dynamic memory in cmDependsJava_yy_create_buffer()" );

  b->yy_is_our_buffer = 1;

  cmDependsJava_yy_init_buffer(b,file ,yyscanner);

  return b;
}

/** Destroy the buffer.
 * @param b a buffer created with cmDependsJava_yy_create_buffer()
 * @param yyscanner The scanner object.
 */
    void cmDependsJava_yy_delete_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

  if ( ! b )
    return;

  if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */
    YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0;

  if ( b->yy_is_our_buffer )
    cmDependsJava_yyfree((void *) b->yy_ch_buf ,yyscanner );

  cmDependsJava_yyfree((void *) b ,yyscanner );
}

#ifndef __cplusplus
extern int isatty (int );
#endif /* __cplusplus */

/* Initializes or reinitializes a buffer.
 * This function is sometimes called more than once on the same buffer,
 * such as during a cmDependsJava_yyrestart() or at EOF.
 */
    static void cmDependsJava_yy_init_buffer  (YY_BUFFER_STATE  b, FILE * file , yyscan_t yyscanner)

{
  int oerrno = errno;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

  cmDependsJava_yy_flush_buffer(b ,yyscanner);

  b->yy_input_file = file;
  b->yy_fill_buffer = 1;

    /* If b is the current buffer, then cmDependsJava_yy_init_buffer was _probably_
     * called from cmDependsJava_yyrestart() or through yy_get_next_buffer.
     * In that case, we don't want to reset the lineno or column.
     */
    if (b != YY_CURRENT_BUFFER){
        b->yy_bs_lineno = 1;
        b->yy_bs_column = 0;
    }

        b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;

  errno = oerrno;
}

/** Discard all buffered characters. On the next scan, YY_INPUT will be called.
 * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER.
 * @param yyscanner The scanner object.
 */
    void cmDependsJava_yy_flush_buffer (YY_BUFFER_STATE  b , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
  if ( ! b )
    return;

  b->yy_n_chars = 0;

  /* We always need two end-of-buffer characters.  The first causes
   * a transition to the end-of-buffer state.  The second causes
   * a jam in that state.
   */
  b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR;
  b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR;

  b->yy_buf_pos = &b->yy_ch_buf[0];

  b->yy_at_bol = 1;
  b->yy_buffer_status = YY_BUFFER_NEW;

  if ( b == YY_CURRENT_BUFFER )
    cmDependsJava_yy_load_buffer_state(yyscanner );
}

/** Pushes the new state onto the stack. The new state becomes
 *  the current state. This function will allocate the stack
 *  if necessary.
 *  @param new_buffer The new state.
 *  @param yyscanner The scanner object.
 */
void cmDependsJava_yypush_buffer_state (YY_BUFFER_STATE new_buffer , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
  if (new_buffer == NULL)
    return;

  cmDependsJava_yyensure_buffer_stack(yyscanner);

  /* This block is copied from cmDependsJava_yy_switch_to_buffer. */
  if ( YY_CURRENT_BUFFER )
    {
    /* Flush out information for old buffer. */
    *yyg->yy_c_buf_p = yyg->yy_hold_char;
    YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = yyg->yy_c_buf_p;
    YY_CURRENT_BUFFER_LVALUE->yy_n_chars = yyg->yy_n_chars;
    }

  /* Only push if top exists. Otherwise, replace top. */
  if (YY_CURRENT_BUFFER)
    yyg->yy_buffer_stack_top++;
  YY_CURRENT_BUFFER_LVALUE = new_buffer;

  /* copied from cmDependsJava_yy_switch_to_buffer. */
  cmDependsJava_yy_load_buffer_state(yyscanner );
  yyg->yy_did_buffer_switch_on_eof = 1;
}

/** Removes and deletes the top of the stack, if present.
 *  The next element becomes the new top.
 *  @param yyscanner The scanner object.
 */
void cmDependsJava_yypop_buffer_state (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
  if (!YY_CURRENT_BUFFER)
    return;

  cmDependsJava_yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner);
  YY_CURRENT_BUFFER_LVALUE = NULL;
  if (yyg->yy_buffer_stack_top > 0)
    --yyg->yy_buffer_stack_top;

  if (YY_CURRENT_BUFFER) {
    cmDependsJava_yy_load_buffer_state(yyscanner );
    yyg->yy_did_buffer_switch_on_eof = 1;
  }
}

/* Allocates the stack if it does not exist.
 *  Guarantees space for at least one push.
 */
static void cmDependsJava_yyensure_buffer_stack (yyscan_t yyscanner)
{
  int nuto_alloc;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

  if (!yyg->yy_buffer_stack) {

    /* First allocation is just for 2 elements, since we don't know if this
     * scanner will even need a stack. We use 2 instead of 1 to avoid an
     * immediate realloc on the next call.
         */
    nuto_alloc = 1;
    yyg->yy_buffer_stack = (struct yy_buffer_state**)cmDependsJava_yyalloc
                (nuto_alloc * sizeof(struct yy_buffer_state*)
                , yyscanner);

    memset(yyg->yy_buffer_stack, 0, nuto_alloc * sizeof(struct yy_buffer_state*));

    yyg->yy_buffer_stack_max = nuto_alloc;
    yyg->yy_buffer_stack_top = 0;
    return;
  }

  if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){

    /* Increase the buffer to prepare for a possible push. */
    int grow_size = 8 /* arbitrary grow size */;

    nuto_alloc = yyg->yy_buffer_stack_max + grow_size;
    yyg->yy_buffer_stack = (struct yy_buffer_state**)cmDependsJava_yyrealloc
                (yyg->yy_buffer_stack,
                nuto_alloc * sizeof(struct yy_buffer_state*)
                , yyscanner);

    /* zero only the new slots.*/
    memset(yyg->yy_buffer_stack + yyg->yy_buffer_stack_max, 0, grow_size * sizeof(struct yy_buffer_state*));
    yyg->yy_buffer_stack_max = nuto_alloc;
  }
}

/** Setup the input buffer state to scan directly from a user-specified character buffer.
 * @param base the character buffer
 * @param size the size in bytes of the character buffer
 * @param yyscanner The scanner object.
 * @return the newly allocated buffer state object.
 */
YY_BUFFER_STATE cmDependsJava_yy_scan_buffer  (char * base, yy_size_t  size , yyscan_t yyscanner)
{
  YY_BUFFER_STATE b;

  if ( size < 2 ||
       base[size-2] != YY_END_OF_BUFFER_CHAR ||
       base[size-1] != YY_END_OF_BUFFER_CHAR )
    /* They forgot to leave room for the EOB's. */
    return 0;

  b = (YY_BUFFER_STATE) cmDependsJava_yyalloc(sizeof( struct yy_buffer_state ) ,yyscanner );
  if ( ! b )
    YY_FATAL_ERROR( "out of dynamic memory in cmDependsJava_yy_scan_buffer()" );

  b->yy_buf_size = size - 2;  /* "- 2" to take care of EOB's */
  b->yy_buf_pos = b->yy_ch_buf = base;
  b->yy_is_our_buffer = 0;
  b->yy_input_file = 0;
  b->yy_n_chars = b->yy_buf_size;
  b->yy_is_interactive = 0;
  b->yy_at_bol = 1;
  b->yy_fill_buffer = 0;
  b->yy_buffer_status = YY_BUFFER_NEW;

  cmDependsJava_yy_switch_to_buffer(b ,yyscanner );

  return b;
}

/** Setup the input buffer state to scan a string. The next call to cmDependsJava_yylex() will
 * scan from a @e copy of @a yy_str.
 * @param yy_str a NUL-terminated string to scan
 * @param yyscanner The scanner object.
 * @return the newly allocated buffer state object.
 * @note If you want to scan bytes that may contain NUL values, then use
 *       cmDependsJava_yy_scan_bytes() instead.
 */
YY_BUFFER_STATE cmDependsJava_yy_scan_string (yyconst char * yy_str , yyscan_t yyscanner)
{

  return cmDependsJava_yy_scan_bytes(yy_str,strlen(yy_str) ,yyscanner);
}

/** Setup the input buffer state to scan the given bytes. The next call to cmDependsJava_yylex() will
 * scan from a @e copy of @a bytes.
 * @param bytes the byte buffer to scan
 * @param len the number of bytes in the buffer pointed to by @a bytes.
 * @param yyscanner The scanner object.
 * @return the newly allocated buffer state object.
 */
YY_BUFFER_STATE cmDependsJava_yy_scan_bytes  (yyconst char * bytes, int  len , yyscan_t yyscanner)
{
  YY_BUFFER_STATE b;
  char *buf;
  yy_size_t n;
  int i;

  /* Get memory for full buffer, including space for trailing EOB's. */
  n = len + 2;
  buf = (char *) cmDependsJava_yyalloc(n ,yyscanner );
  if ( ! buf )
    YY_FATAL_ERROR( "out of dynamic memory in cmDependsJava_yy_scan_bytes()" );

  for ( i = 0; i < len; ++i )
    buf[i] = bytes[i];

  buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR;

  b = cmDependsJava_yy_scan_buffer(buf,n ,yyscanner);
  if ( ! b )
    YY_FATAL_ERROR( "bad buffer in cmDependsJava_yy_scan_bytes()" );

  /* It's okay to grow etc. this buffer, and we should throw it
   * away when we're done.
   */
  b->yy_is_our_buffer = 1;

  return b;
}

#ifndef YY_EXIT_FAILURE
#define YY_EXIT_FAILURE 2
#endif

static void yy_fatal_error (yyconst char* msg , yyscan_t)
{
      (void) fprintf( stderr, "%s\n", msg );
  exit( YY_EXIT_FAILURE );
}

/* Redefine yyless() so it works in section 3 code. */

#undef yyless
#define yyless(n) \
  do \
    { \
    /* Undo effects of setting up yytext. */ \
        int yyless_macro_arg = (n); \
        YY_LESS_LINENO(yyless_macro_arg);\
    yytext[yyleng] = yyg->yy_hold_char; \
    yyg->yy_c_buf_p = yytext + yyless_macro_arg; \
    yyg->yy_hold_char = *yyg->yy_c_buf_p; \
    *yyg->yy_c_buf_p = '\0'; \
    yyleng = yyless_macro_arg; \
    } \
  while ( 0 )

/* Accessor  methods (get/set functions) to struct members. */

/** Get the user-defined data for this scanner.
 * @param yyscanner The scanner object.
 */
YY_EXTRA_TYPE cmDependsJava_yyget_extra  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    return yyextra;
}

/** Get the current line number.
 * @param yyscanner The scanner object.
 */
int cmDependsJava_yyget_lineno  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

        if (! YY_CURRENT_BUFFER)
            return 0;

    return yylineno;
}

/** Get the current column number.
 * @param yyscanner The scanner object.
 */
int cmDependsJava_yyget_column  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

        if (! YY_CURRENT_BUFFER)
            return 0;

    return yycolumn;
}

/** Get the input stream.
 * @param yyscanner The scanner object.
 */
FILE *cmDependsJava_yyget_in  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    return yyin;
}

/** Get the output stream.
 * @param yyscanner The scanner object.
 */
FILE *cmDependsJava_yyget_out  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    return yyout;
}

/** Get the length of the current token.
 * @param yyscanner The scanner object.
 */
int cmDependsJava_yyget_leng  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    return yyleng;
}

/** Get the current token.
 * @param yyscanner The scanner object.
 */

char *cmDependsJava_yyget_text  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    return yytext;
}

/** Set the user-defined data. This data is never touched by the scanner.
 * @param user_defined The data to be associated with this scanner.
 * @param yyscanner The scanner object.
 */
void cmDependsJava_yyset_extra (YY_EXTRA_TYPE  user_defined , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    yyextra = user_defined ;
}

/** Set the current line number.
 * @param line_number The line number to set.
 * @param yyscanner The scanner object.
 */
void cmDependsJava_yyset_lineno (int  line_number , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

        /* lineno is only valid if an input buffer exists. */
        if (! YY_CURRENT_BUFFER )
           yy_fatal_error( "cmDependsJava_yyset_lineno called with no buffer" , yyscanner);

    yylineno = line_number;
}

/** Set the current column.
 * @param column_no The column number to set.
 * @param yyscanner The scanner object.
 */
void cmDependsJava_yyset_column (int  column_no , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

        /* column is only valid if an input buffer exists. */
        if (! YY_CURRENT_BUFFER )
           yy_fatal_error( "cmDependsJava_yyset_column called with no buffer" , yyscanner);

    yycolumn = column_no;
}

/** Set the input stream. This does not discard the current
 * input buffer.
 * @param in_str A readable stream.
 * @param yyscanner The scanner object.
 * @see cmDependsJava_yy_switch_to_buffer
 */
void cmDependsJava_yyset_in (FILE *  in_str , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    yyin = in_str ;
}

void cmDependsJava_yyset_out (FILE *  out_str , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    yyout = out_str ;
}

int cmDependsJava_yyget_debug  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    return yy_flex_debug;
}

void cmDependsJava_yyset_debug (int  bdebug , yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    yy_flex_debug = bdebug ;
}

/* Accessor methods for yylval and yylloc */

static int yy_init_globals (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
    /* Initialization is the same as for the non-reentrant scanner.
       This function is called once per scanner lifetime. */

    yyg->yy_buffer_stack = 0;
    yyg->yy_buffer_stack_top = 0;
    yyg->yy_buffer_stack_max = 0;
    yyg->yy_c_buf_p = (char *) 0;
    yyg->yy_init = 1;
    yyg->yy_start = 0;
    yyg->yy_start_stack_ptr = 0;
    yyg->yy_start_stack_depth = 0;
    yyg->yy_start_stack = (int *) 0;

/* Defined in main.c */
#ifdef YY_STDINIT
    yyin = stdin;
    yyout = stdout;
#else
    yyin = (FILE *) 0;
    yyout = (FILE *) 0;
#endif

    /* For future reference: Set errno on error, since we are called by
     * cmDependsJava_yylex_init()
     */
    return 0;
}

/* User-visible API */

/* cmDependsJava_yylex_init is special because it creates the scanner itself, so it is
 * the ONLY reentrant function that doesn't take the scanner as the last argument.
 * That's why we explicitly handle the declaration, instead of using our macros.
 */

int cmDependsJava_yylex_init(yyscan_t* ptr_yy_globals)

{
    if (ptr_yy_globals == NULL){
        errno = EINVAL;
        return 1;
    }

    *ptr_yy_globals = (yyscan_t) cmDependsJava_yyalloc ( sizeof( struct yyguts_t ), NULL );

    if (*ptr_yy_globals == NULL){
        errno = ENOMEM;
        return 1;
    }

    memset(*ptr_yy_globals,0,sizeof(struct yyguts_t));

    return yy_init_globals ( *ptr_yy_globals );
}

/* cmDependsJava_yylex_destroy is for both reentrant and non-reentrant scanners. */
int cmDependsJava_yylex_destroy  (yyscan_t yyscanner)
{
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;

    /* Pop the buffer stack, destroying each element. */
  while(YY_CURRENT_BUFFER){
    cmDependsJava_yy_delete_buffer(YY_CURRENT_BUFFER ,yyscanner );
    YY_CURRENT_BUFFER_LVALUE = NULL;
    cmDependsJava_yypop_buffer_state(yyscanner);
  }

  /* Destroy the stack itself. */
  cmDependsJava_yyfree(yyg->yy_buffer_stack ,yyscanner);
  yyg->yy_buffer_stack = NULL;

    /* Destroy the start condition stack. */
        cmDependsJava_yyfree(yyg->yy_start_stack ,yyscanner );
        yyg->yy_start_stack = NULL;

    /* Destroy the main struct (reentrant only). */
    cmDependsJava_yyfree ( yyscanner , yyscanner );
    return 0;
}

/*
 * Internal utility routines.
 */

#ifndef yytext_ptr
static void yy_flex_strncpy (char* s1, yyconst char * s2, int n , yyscan_t yyscanner)
{
  int i;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
  for ( i = 0; i < n; ++i )
    s1[i] = s2[i];
}
#endif

#ifdef YY_NEED_STRLEN
static int yy_flex_strlen (yyconst char * s , yyscan_t yyscanner)
{
  int n;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
  for ( n = 0; s[n]; ++n )
    ;

  return n;
}
#endif

void *cmDependsJava_yyalloc (yy_size_t  size , yyscan_t)
{
  return (void *) malloc( size );
}

void *cmDependsJava_yyrealloc  (void * ptr, yy_size_t  size , yyscan_t)
{
  /* The cast to (char *) in the following accommodates both
   * implementations that use char* generic pointers, and those
   * that use void* generic pointers.  It works with the latter
   * because both ANSI C and C++ allow castless assignment from
   * any pointer type to void*, and deal with argument conversions
   * as though doing an assignment.
   */
  return (void *) realloc( (char *) ptr, size );
}

void cmDependsJava_yyfree (void * ptr , yyscan_t)
{
  free( (char *) ptr );  /* see cmDependsJava_yyrealloc() for (char *) cast */
}

#define YYTABLES_NAME "yytables"

#undef YY_NEW_FILE
#undef YY_FLUSH_BUFFER
#undef yy_set_bol
#undef yy_new_buffer
#undef yy_set_interactive
#undef yytext_ptr
#undef YY_DO_BEFORE_ACTION

#ifdef YY_DECL_IS_OURS
#undef YY_DECL_IS_OURS
#undef YY_DECL
#endif
#line 214 "cmDependsJavaLexer.in.l"



