#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__)
#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"
/*=========================================================================

  Program:   CMake - Cross-Platform Makefile Generator
  Module:    $RCSfile: cmDependsJavaLexer.cxx,v $
  Language:  C++
  Date:      $Date: 2012/03/29 17:21:07 $
  Version:   $Revision: 1.1.1.1 $

  Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.
  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.

     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notices 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"



