#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"
/*============================================================================
  CMake - Cross Platform Makefile Generator
  Copyright 2000-2009 Kitware, Inc., Insight Software Consortium

  Distributed under the OSI-approved BSD License (the "License");
  see accompanying file Copyright.txt for details.

  This software is distributed WITHOUT ANY WARRANTY; without even the
  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  See the License for more information.
============================================================================*/
/*

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"



