#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
{
  register yy_state_type yy_current_state;
  register char *yy_cp, *yy_bp;
  register 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
      {
      register 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 silences a warning*/
} /* 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;
  register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
  register char *source = yyg->yytext_ptr;
  register 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)
{
  register yy_state_type yy_current_state;
  register 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 )
    {
    register 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)
{
  register int yy_is_jam;
    struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
  register char *yy_cp = yyg->yy_c_buf_p;

  register 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 str.
 * @param 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
 * @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 line_number
 * @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)
{
  register 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)
{
  register 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"



