/*******************************************************************************
 * Copyright (c) 2001, 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *     Jens Lukowski/Innoopract - initial renaming/restructuring
 *     
 *******************************************************************************/
/* The following code was generated by JFlex 1.3.5 on 3/14/05 9:37 PM */
/*nlsXXX*/
package org.eclipse.wst.dtd.core.internal.tokenizer;

import org.eclipse.wst.dtd.core.internal.parser.DTDRegionTypes;

/** 
 * Generate with "dtdskeleton".
 *
 * It removes some unused fields and avoids some compiler warnings 
 */


/**
 * This class is a scanner generated by 
 * <a href="http://www.jflex.de/">JFlex</a> 1.3.5
 * on 3/14/05 9:37 PM from the specification file
 * <tt>file:/D:/eclipse.wtp/workspace/org.eclipse.wst.dtd.core/src/org/eclipse/wst/dtd/core/internal/tokenizer/dtd.flex</tt>
 */
public class DTDTokenizer {

  /** This character denotes the end of file */
  final public static int YYEOF = -1;

  /** initial size of the lookahead buffer */
  final private static int YY_BUFFERSIZE = 16384;

  /** lexical states */
  final public static int ATTRIBUTE_ENUMERATION = 13;
  final public static int NOTATION_NAME = 6;
  final public static int ELEMENT_CHILD = 1;
  final public static int ENTITY_CONTENT = 4;
  final public static int COMMENT_CONTENT = 8;
  final public static int ATTLIST_NAME = 9;
  final public static int EXTERNALID_CONTENT = 7;
  final public static int ELEMENT_CONTENT = 1;
  final public static int ELEMENT_MIXED = 1;
  final public static int ELEMENT_MIXED_OR_CHILD = 1;
  final public static int ATTRIBUTE_CONTENT = 11;
  final public static int ENTITY_NAME = 3;
  final public static int ATTRIBUTE_DEFAULT = 12;
  final public static int ELEMENT_NAME = 2;
  final public static int YYINITIAL = 0;
  final public static int NDATA_CONTENT = 5;
  final public static int ATTLIST_CONTENT = 10;
  final public static int NODE = 1;

  /** 
   * Translates characters to character classes
   */
  final private static String yycmap_packed = 
    "\10\0\1\0\1\5\1\3\1\0\1\0\1\2\22\0\1\5\1\6"+
    "\1\1\1\37\1\0\1\23\1\0\1\46\1\42\1\43\1\4\1\7"+
    "\1\45\1\12\1\0\1\0\12\0\1\0\1\10\1\11\1\0\1\13"+
    "\1\4\1\0\1\25\1\31\1\32\1\33\1\14\1\35\2\0\1\21"+
    "\1\0\1\36\1\15\1\16\1\17\1\24\1\27\1\40\1\34\1\26"+
    "\1\20\1\30\2\0\1\41\1\22\1\0\1\0\1\0\2\0\1\0"+
    "\1\0\32\0\1\0\1\44\uff83\0";

  /** 
   * Translates characters to character classes
   */
  final private static char [] yycmap = yy_unpack_cmap(yycmap_packed);

  /** 
   * Translates a state to a row index in the transition table
   */
  final private static int yy_rowMap [] = { 
        0,    39,    78,   117,   156,   195,   234,   273,   312,   351, 
      390,   429,   468,   507,   546,   585,   624,    39,    39,    39, 
      663,   702,   741,   780,   819,    39,    39,   858,   897,    39, 
       39,   936,   936,   975,  1014,  1053,  1092,  1131,  1170,  1209, 
     1248,  1287,  1326,  1365,  1404,  1443,    39,  1482,  1521,  1560, 
     1599,  1638,    39,  1677,  1716,  1755,  1794,  1833,  1872,    39, 
       39,  1911,  1950,  1989,  2028,  2067,  2106,    39,    39,    39, 
     2145,  2184,  2223,  2262,  2301,  2340,  2379,   897,  2418,   975, 
     2457,  2496,  2535,  2574,   975,  2613,  2652,  2691,  2730,  1560, 
     2769,  2808,  2847,  2886,  2925,  2964,  3003,  3042,  3081,  3120, 
     1950,  3159,  3198,  3237,  3276,  3315,  1950,    39,  3354,  3393, 
     3432,    39,  3471,  3510,  3549,    39,  3588,  3627,    39,  3666, 
     3705,  3744,    39,    39,  3783,  3822,  3861,  3900,  3939,  3978, 
     4017,  4056,    39,  4095,  4134,  4173,    39,  4212,  4251,  4290, 
     4329,  4368,  4407,  4446,  4485,  4524,  4563,  4602,  4641,  4680, 
     4719,  4758,  4797,  4836,  4875,  4914,  4953,  4992,  5031,  5070, 
     5109,  5148,  5187,  5226,  5265,  5304,  5343,   975,  5382,  5421, 
     5460,  5499,  5538,  5577,  1560,  5616,  5655,  5694,  5733,  5772, 
     5811,  5850,   546,  5889,  5928,  5967,  6006,   975,   975,   975, 
     6045,  1560,  6084,  6123,  1560,  6162,  6201,  6240,  1950,   546, 
     6279,   546,   819,  6318,  6357,  6396,  6435,  6474,  6513,   546, 
     6552,  1560,  1560,  1560,  1950,  6591,    39,  1950
  };

  /** 
   * The packed transition table of the DFA (part 0)
   */
  final private static String yy_packed0 = 
    "\2\17\2\20\1\17\1\20\1\21\1\17\1\22\1\23"+
    "\1\17\1\24\1\25\2\17\1\26\3\17\1\27\1\17"+
    "\1\30\21\17\47\0\2\31\2\20\1\32\1\20\1\0"+
    "\1\32\1\31\1\33\1\31\1\33\23\31\1\34\2\31"+
    "\1\35\1\36\2\37\1\31\2\40\2\20\1\0\1\20"+
    "\3\40\1\33\1\40\1\33\7\40\1\41\16\40\4\0"+
    "\1\40\1\42\1\43\2\20\1\42\1\20\3\42\1\33"+
    "\1\42\1\33\12\42\1\44\1\45\16\42\1\46\2\47"+
    "\2\20\1\47\1\20\3\47\1\33\1\47\1\33\33\47"+
    "\2\50\2\20\1\0\1\20\2\0\1\50\1\33\1\50"+
    "\1\33\26\50\4\0\1\50\1\42\1\43\2\20\1\42"+
    "\1\20\3\42\1\33\1\42\1\33\3\42\1\51\6\42"+
    "\1\52\1\53\16\42\1\46\2\54\2\55\1\54\1\55"+
    "\4\54\1\56\1\57\33\54\2\60\2\20\1\42\1\20"+
    "\2\42\1\60\1\33\1\60\1\33\26\60\4\42\1\60"+
    "\2\61\2\20\1\42\1\20\2\42\1\61\1\33\1\61"+
    "\1\33\26\61\4\42\1\61\1\62\1\63\1\64\1\65"+
    "\1\62\1\66\3\62\1\33\1\62\1\33\1\67\2\62"+
    "\1\70\1\62\1\71\10\62\1\72\4\62\1\73\2\62"+
    "\1\74\2\75\1\62\1\76\1\77\1\100\2\20\1\77"+
    "\1\20\3\77\1\33\1\77\1\33\23\77\1\101\6\77"+
    "\1\102\2\103\2\20\1\103\1\20\3\103\1\33\1\103"+
    "\1\33\26\103\1\104\1\105\1\106\2\103\2\17\2\0"+
    "\1\17\2\0\1\17\2\0\1\17\1\0\7\17\1\0"+
    "\23\17\2\0\2\20\1\0\1\20\53\0\1\107\34\0"+
    "\2\17\2\0\1\17\2\0\1\17\2\0\1\17\1\0"+
    "\1\17\1\110\1\17\1\111\3\17\1\0\25\17\2\0"+
    "\1\17\2\0\1\17\2\0\1\17\1\0\7\17\1\0"+
    "\1\112\22\17\2\113\2\0\1\113\2\0\1\113\2\0"+
    "\1\113\1\0\7\113\1\0\23\113\2\17\2\0\1\17"+
    "\2\0\1\17\2\0\1\17\1\0\4\17\1\114\2\17"+
    "\1\0\23\17\2\31\6\0\1\31\1\0\1\31\1\0"+
    "\26\31\4\0\3\31\6\0\1\31\1\0\1\31\1\0"+
    "\13\31\1\115\12\31\4\0\1\31\2\0\2\116\1\0"+
    "\1\116\31\0\1\117\7\0\2\40\4\0\3\40\1\0"+
    "\1\40\1\0\26\40\4\0\1\40\2\42\2\0\1\42"+
    "\1\0\3\42\1\0\1\42\1\0\33\42\1\43\1\120"+
    "\2\121\1\43\1\121\3\43\1\121\1\43\1\121\33\43"+
    "\2\42\2\0\1\42\1\0\3\42\1\0\1\42\1\0"+
    "\6\42\1\122\26\42\2\0\1\42\1\0\3\42\1\0"+
    "\1\42\1\0\14\42\1\123\16\42\2\46\2\124\1\46"+
    "\1\124\3\46\1\124\1\46\1\124\32\46\1\125\2\47"+
    "\2\0\1\47\1\0\3\47\1\0\1\47\1\0\33\47"+
    "\2\50\6\0\1\50\1\0\1\50\1\0\26\50\4\0"+
    "\1\50\2\42\2\0\1\42\1\0\3\42\1\0\1\42"+
    "\1\0\17\42\1\126\15\42\2\0\1\42\1\0\3\42"+
    "\1\0\1\42\1\0\6\42\1\127\26\42\2\0\1\42"+
    "\1\0\3\42\1\0\1\42\1\0\14\42\1\130\16\42"+
    "\12\54\2\0\35\54\2\55\1\54\1\55\4\54\2\0"+
    "\33\54\12\0\1\131\34\0\2\60\2\0\1\42\1\0"+
    "\2\42\1\60\1\0\1\60\1\0\26\60\4\42\1\60"+
    "\2\61\2\0\1\42\1\0\2\42\1\61\1\0\1\61"+
    "\1\0\26\61\4\42\1\61\2\62\2\0\1\62\1\0"+
    "\3\62\1\0\1\62\1\0\26\62\3\0\2\62\1\63"+
    "\1\132\2\133\1\63\1\133\3\63\1\133\1\63\1\133"+
    "\26\63\3\133\2\63\3\0\1\65\50\0\1\66\41\0"+
    "\2\62\2\0\1\62\1\0\3\62\1\0\1\62\1\0"+
    "\3\62\1\134\22\62\3\0\4\62\2\0\1\62\1\0"+
    "\3\62\1\0\1\62\1\0\2\62\1\135\5\62\1\136"+
    "\15\62\3\0\4\62\2\0\1\62\1\0\3\62\1\0"+
    "\1\62\1\0\17\62\1\137\6\62\3\0\4\62\2\0"+
    "\1\62\1\0\3\62\1\0\1\62\1\0\17\62\1\140"+
    "\6\62\3\0\4\62\2\0\1\62\1\0\3\62\1\0"+
    "\1\62\1\0\5\62\1\141\12\62\1\142\1\143\4\62"+
    "\3\0\2\62\2\76\2\144\1\76\1\144\3\76\1\144"+
    "\1\76\1\144\26\76\3\144\1\76\1\132\2\77\2\0"+
    "\1\77\1\0\3\77\1\0\1\77\1\0\33\77\1\100"+
    "\1\145\2\146\1\100\1\146\3\100\1\146\1\100\1\146"+
    "\33\100\2\77\2\0\1\77\1\0\3\77\1\0\1\77"+
    "\1\0\5\77\1\147\12\77\1\150\1\151\11\77\2\102"+
    "\2\152\1\102\1\152\3\102\1\152\1\102\1\152\32\102"+
    "\1\153\2\103\2\0\1\103\1\0\3\103\1\0\1\103"+
    "\1\0\26\103\3\0\2\103\12\0\1\154\34\0\2\17"+
    "\2\0\1\17\2\0\1\17\2\0\1\17\1\0\1\155"+
    "\6\17\1\0\25\17\2\0\1\17\2\0\1\17\2\0"+
    "\1\17\1\0\4\17\1\156\2\17\1\0\25\17\2\0"+
    "\1\17\2\0\1\17\2\0\1\17\1\0\4\17\1\157"+
    "\2\17\1\0\23\17\2\113\2\0\1\113\2\0\1\113"+
    "\1\160\1\0\1\113\1\0\7\113\1\0\23\113\2\17"+
    "\2\0\1\17\2\0\1\17\2\0\1\17\1\0\4\17"+
    "\1\161\2\17\1\0\23\17\2\31\6\0\1\31\1\0"+
    "\1\31\1\0\16\31\1\162\7\31\4\0\1\31\27\0"+
    "\1\163\17\0\1\121\1\164\45\121\2\42\2\0\1\42"+
    "\1\0\3\42\1\0\1\42\1\0\12\42\1\165\22\42"+
    "\2\0\1\42\1\0\3\42\1\0\1\42\1\0\15\42"+
    "\1\166\15\42\46\124\1\167\2\42\2\0\1\42\1\0"+
    "\3\42\1\0\1\42\1\0\11\42\1\170\23\42\2\0"+
    "\1\42\1\0\3\42\1\0\1\42\1\0\12\42\1\171"+
    "\22\42\2\0\1\42\1\0\3\42\1\0\1\42\1\0"+
    "\15\42\1\172\15\42\13\0\1\173\33\0\1\133\1\174"+
    "\45\133\2\62\2\0\1\62\1\0\3\62\1\0\1\62"+
    "\1\0\4\62\1\175\21\62\3\0\4\62\2\0\1\62"+
    "\1\0\3\62\1\0\1\62\1\0\4\62\1\176\21\62"+
    "\3\0\4\62\2\0\1\62\1\0\3\62\1\0\1\62"+
    "\1\0\4\62\1\177\21\62\3\0\4\62\2\0\1\62"+
    "\1\0\3\62\1\0\1\62\1\0\20\62\1\200\5\62"+
    "\3\0\4\62\2\0\1\62\1\0\3\62\1\0\1\62"+
    "\1\0\11\62\1\201\14\62\3\0\4\62\2\0\1\62"+
    "\1\0\3\62\1\0\1\62\1\0\2\62\1\202\23\62"+
    "\3\0\4\62\2\0\1\62\1\0\3\62\1\0\1\62"+
    "\1\0\1\203\25\62\3\0\4\62\2\0\1\62\1\0"+
    "\3\62\1\0\1\62\1\0\5\62\1\204\20\62\3\0"+
    "\2\62\46\144\1\174\1\146\1\205\45\146\2\77\2\0"+
    "\1\77\1\0\3\77\1\0\1\77\1\0\2\77\1\206"+
    "\32\77\2\0\1\77\1\0\3\77\1\0\1\77\1\0"+
    "\1\207\34\77\2\0\1\77\1\0\3\77\1\0\1\77"+
    "\1\0\5\77\1\210\25\77\46\152\1\211\2\17\2\0"+
    "\1\17\2\0\1\17\2\0\1\17\1\0\2\17\1\212"+
    "\4\17\1\0\25\17\2\0\1\17\2\0\1\17\2\0"+
    "\1\17\1\0\5\17\1\213\1\17\1\0\25\17\2\0"+
    "\1\17\2\0\1\17\2\0\1\17\1\0\7\17\1\0"+
    "\1\17\1\214\23\17\2\0\1\17\2\0\1\17\2\0"+
    "\1\17\1\0\1\17\1\215\5\17\1\0\23\17\2\31"+
    "\6\0\1\31\1\0\1\31\1\0\17\31\1\216\6\31"+
    "\4\0\1\31\32\0\1\217\14\0\2\42\2\0\1\42"+
    "\1\0\3\42\1\0\1\42\1\0\4\42\1\220\30\42"+
    "\2\0\1\42\1\0\3\42\1\0\1\42\1\0\1\42"+
    "\1\221\33\42\2\0\1\42\1\0\3\42\1\0\1\42"+
    "\1\0\4\42\1\222\30\42\2\0\1\42\1\0\3\42"+
    "\1\0\1\42\1\0\4\42\1\223\30\42\2\0\1\42"+
    "\1\0\3\42\1\0\1\42\1\0\1\42\1\224\31\42"+
    "\2\62\2\0\1\62\1\0\3\62\1\0\1\62\1\0"+
    "\5\62\1\225\20\62\3\0\4\62\2\0\1\62\1\0"+
    "\3\62\1\0\1\62\1\0\10\62\1\226\15\62\3\0"+
    "\4\62\2\0\1\62\1\0\3\62\1\0\1\62\1\0"+
    "\11\62\1\227\14\62\3\0\4\62\2\0\1\62\1\0"+
    "\3\62\1\0\1\62\1\0\1\230\25\62\3\0\4\62"+
    "\2\0\1\62\1\0\3\62\1\0\1\62\1\0\4\62"+
    "\1\231\21\62\3\0\4\62\2\0\1\62\1\0\3\62"+
    "\1\0\1\62\1\0\13\62\1\232\12\62\3\0\4\62"+
    "\2\0\1\62\1\0\3\62\1\0\1\62\1\0\24\62"+
    "\1\233\1\62\3\0\4\62\2\0\1\62\1\0\3\62"+
    "\1\0\1\62\1\0\25\62\1\234\3\0\2\62\2\77"+
    "\2\0\1\77\1\0\3\77\1\0\1\77\1\0\13\77"+
    "\1\235\21\77\2\0\1\77\1\0\3\77\1\0\1\77"+
    "\1\0\24\77\1\236\10\77\2\0\1\77\1\0\3\77"+
    "\1\0\1\77\1\0\25\77\1\237\5\77\2\17\2\0"+
    "\1\17\2\0\1\17\2\0\1\17\1\0\1\240\6\17"+
    "\1\0\25\17\2\0\1\17\2\0\1\17\2\0\1\17"+
    "\1\0\4\17\1\241\2\17\1\0\25\17\2\0\1\17"+
    "\2\0\1\17\2\0\1\17\1\0\4\17\1\242\2\17"+
    "\1\0\25\17\2\0\1\17\2\0\1\17\2\0\1\17"+
    "\1\0\5\17\1\243\1\17\1\0\23\17\2\31\6\0"+
    "\1\31\1\0\1\31\1\0\11\31\1\244\14\31\4\0"+
    "\1\31\33\0\1\245\13\0\2\42\2\0\1\42\1\0"+
    "\3\42\1\0\1\42\1\0\1\246\34\42\2\0\1\42"+
    "\1\0\3\42\1\0\1\42\1\0\5\42\1\247\27\42"+
    "\2\0\1\42\1\0\3\42\1\0\1\42\1\0\11\42"+
    "\1\250\23\42\2\0\1\42\1\0\3\42\1\0\1\42"+
    "\1\0\1\251\34\42\2\0\1\42\1\0\3\42\1\0"+
    "\1\42\1\0\5\42\1\252\25\42\2\62\2\0\1\62"+
    "\1\0\3\62\1\0\1\62\1\0\4\62\1\253\21\62"+
    "\3\0\4\62\2\0\1\62\1\0\3\62\1\0\1\62"+
    "\1\0\22\62\1\254\3\62\3\0\4\62\2\0\1\62"+
    "\1\0\3\62\1\0\1\62\1\0\4\62\1\255\21\62"+
    "\3\0\4\62\2\0\1\62\1\0\3\62\1\0\1\62"+
    "\1\0\21\62\1\256\4\62\3\0\4\62\2\0\1\62"+
    "\1\0\3\62\1\0\1\62\1\0\11\62\1\257\14\62"+
    "\3\0\4\62\2\0\1\62\1\0\3\62\1\0\1\62"+
    "\1\0\1\62\1\260\24\62\3\0\4\62\2\0\1\62"+
    "\1\0\3\62\1\0\1\62\1\0\14\62\1\261\11\62"+
    "\3\0\4\62\2\0\1\62\1\0\3\62\1\0\1\62"+
    "\1\0\1\262\25\62\3\0\2\62\2\77\2\0\1\77"+
    "\1\0\3\77\1\0\1\77\1\0\1\77\1\263\33\77"+
    "\2\0\1\77\1\0\3\77\1\0\1\77\1\0\14\77"+
    "\1\264\20\77\2\0\1\77\1\0\3\77\1\0\1\77"+
    "\1\0\1\265\32\77\2\17\2\0\1\17\2\0\1\17"+
    "\2\0\1\17\1\0\3\17\1\266\3\17\1\0\25\17"+
    "\2\0\1\17\2\0\1\17\2\0\1\17\1\0\6\17"+
    "\1\267\1\0\25\17\2\0\1\17\2\0\1\17\2\0"+
    "\1\17\1\0\5\17\1\270\1\17\1\0\25\17\2\0"+
    "\1\17\2\0\1\17\2\0\1\17\1\0\7\17\1\0"+
    "\2\17\1\271\20\17\2\31\6\0\1\31\1\0\1\31"+
    "\1\0\4\31\1\272\21\31\4\0\1\31\25\0\1\273"+
    "\21\0\2\42\2\0\1\42\1\0\3\42\1\0\1\42"+
    "\1\0\2\42\1\274\32\42\2\0\1\42\1\0\3\42"+
    "\1\0\1\42\1\0\16\42\1\274\16\42\2\0\1\42"+
    "\1\0\3\42\1\0\1\42\1\0\2\42\1\275\32\42"+
    "\2\0\1\42\1\0\3\42\1\0\1\42\1\0\16\42"+
    "\1\276\14\42\2\62\2\0\1\62\1\0\3\62\1\0"+
    "\1\62\1\0\5\62\1\277\1\300\17\62\3\0\4\62"+
    "\2\0\1\62\1\0\3\62\1\0\1\62\1\0\1\301"+
    "\25\62\3\0\4\62\2\0\1\62\1\0\3\62\1\0"+
    "\1\62\1\0\5\62\1\302\20\62\3\0\4\62\2\0"+
    "\1\62\1\0\3\62\1\0\1\62\1\0\12\62\1\303"+
    "\13\62\3\0\4\62\2\0\1\62\1\0\3\62\1\0"+
    "\1\62\1\0\5\62\1\234\20\62\3\0\4\62\2\0"+
    "\1\62\1\0\3\62\1\0\1\62\1\0\5\62\1\304"+
    "\20\62\3\0\4\62\2\0\1\62\1\0\3\62\1\0"+
    "\1\62\1\0\17\62\1\132\6\62\3\0\2\62\2\77"+
    "\2\0\1\77\1\0\3\77\1\0\1\77\1\0\5\77"+
    "\1\305\27\77\2\0\1\77\1\0\3\77\1\0\1\77"+
    "\1\0\5\77\1\306\27\77\2\0\1\77\1\0\3\77"+
    "\1\0\1\77\1\0\17\77\1\307\13\77\2\17\2\0"+
    "\1\17\2\0\1\17\2\0\1\17\1\0\4\17\1\310"+
    "\2\17\1\0\25\17\2\0\1\17\2\0\1\17\2\0"+
    "\1\17\1\0\7\17\1\0\1\311\24\17\2\0\1\17"+
    "\2\0\1\17\2\0\1\17\1\0\4\17\1\312\2\17"+
    "\1\0\23\17\2\31\6\0\1\31\1\0\1\31\1\0"+
    "\11\31\1\313\14\31\4\0\1\31\20\0\1\314\26\0"+
    "\2\62\2\0\1\62\1\0\3\62\1\0\1\62\1\0"+
    "\1\315\25\62\3\0\4\62\2\0\1\62\1\0\3\62"+
    "\1\0\1\62\1\0\3\62\1\316\22\62\3\0\4\62"+
    "\2\0\1\62\1\0\3\62\1\0\1\62\1\0\10\62"+
    "\1\317\15\62\3\0\4\62\2\0\1\62\1\0\3\62"+
    "\1\0\1\62\1\0\20\62\1\234\5\62\3\0\2\62"+
    "\2\77\2\0\1\77\1\0\3\77\1\0\1\77\1\0"+
    "\1\320\34\77\2\0\1\77\1\0\3\77\1\0\1\77"+
    "\1\0\20\77\1\321\12\77\2\17\2\0\1\17\2\0"+
    "\1\17\2\0\1\17\1\0\3\17\1\322\3\17\1\0"+
    "\23\17\25\0\1\323\21\0\2\62\2\0\1\62\1\0"+
    "\3\62\1\0\1\62\1\0\12\62\1\324\13\62\3\0"+
    "\4\62\2\0\1\62\1\0\3\62\1\0\1\62\1\0"+
    "\12\62\1\325\13\62\3\0\4\62\2\0\1\62\1\0"+
    "\3\62\1\0\1\62\1\0\3\62\1\326\22\62\3\0"+
    "\2\62\2\77\2\0\1\77\1\0\3\77\1\0\1\77"+
    "\1\0\17\77\1\327\15\77\2\0\1\77\1\0\3\77"+
    "\1\0\1\77\1\0\1\330\32\77\2\0\2\323\1\0"+
    "\1\323\35\0\1\331\3\0\2\77\2\0\1\77\1\0"+
    "\3\77\1\0\1\77\1\0\17\77\1\332\13\77";

  /** 
   * The transition table of the DFA
   */
  final private static int yytrans [] = yy_unpack();


  /* error codes */
  final private static int YY_UNKNOWN_ERROR = 0;
  final static int YY_ILLEGAL_STATE = 1;
  final private static int YY_NO_MATCH = 2;
  final private static int YY_PUSHBACK_2BIG = 3;

  /* error messages for the codes above */
  final private static String YY_ERROR_MSG[] = {
    "Unkown internal scanner error",
    "Internal error: unknown state",
    "Error: could not match input",
    "Error: pushback value was too large"
  };

  /**
   * YY_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
   */
  private final static byte YY_ATTRIBUTE[] = {
     0,  8,  0,  0,  1,  1,  0,  1,  0,  1,  1,  1,  1,  1,  1,  1, 
     1,  9,  9,  9,  1,  1,  1,  1,  1,  9,  9,  1,  1,  9,  9,  1, 
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  9,  1, 
     1,  1,  1,  1,  9,  1,  1,  1,  1,  1,  1,  9,  9,  1,  1,  1, 
     1,  1,  1,  9,  9,  9,  0,  1,  1,  1,  0,  1,  1,  0,  0,  1, 
     0,  1,  1,  0,  1,  1,  1,  1,  0,  1,  0,  1,  1,  1,  1,  1, 
     1,  1,  1,  0,  1,  0,  1,  1,  1,  0,  1,  9,  1,  1,  1,  9, 
     1,  1,  0,  9,  1,  1,  9,  1,  1,  1,  9,  9,  1,  1,  1,  1, 
     1,  1,  1,  1,  9,  1,  1,  1,  9,  1,  1,  1,  1,  1,  0,  1, 
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
     1,  1,  1,  1,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1, 
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1,  1, 
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  1,  1,  1,  1, 
     1,  1,  0,  1,  1,  1,  1,  1,  9,  1
  };

  /** the input device */
  private java.io.Reader yy_reader;

  /** the current state of the DFA */
  private int yy_state;

  /** the current lexical state */
  private int yy_lexical_state = YYINITIAL;

  /** this buffer contains the current text to be matched and is
      the source of the yytext() string */
  private char yy_buffer[] = new char[YY_BUFFERSIZE];

  /** the textposition at the last accepting state */
  private int yy_markedPos;

  /** the textposition at the last state to be included in yytext */
  //private int yy_pushbackPos;

  /** the current text position in the buffer */
  private int yy_currentPos;

  /** startRead marks the beginning of the yytext() string in the buffer */
  private int yy_startRead;

  /** endRead marks the last character in the buffer, that has been read
      from input */
  private int yy_endRead;

  /** number of newlines encountered up to the start of the matched text */
  private int yyline;

  /** the number of characters up to the start of the matched text */
  private int yychar;

  /**
   * the number of characters from the last newline up to the start of the 
   * matched text
   */
  int yycolumn; 

  /** yy_atEOF == true <=> the scanner is at the EOF */
  private boolean yy_atEOF;

  /* user code: */
	int node_count = 0;
	String currentString;

	private Token createToken(String type) {
		return new Token(type, yytext(), yyline, yychar + startOffset, yylength());
	}

	private int startOffset = 0;
	public void setStartOffset(int offset) {
		this.startOffset = offset;
	}

	public void setLine(int line) {
		this.yyline = line;
	}


  /**
   * Creates a new scanner
   * There is also a java.io.InputStream version of this constructor.
   *
   * @param   in  the java.io.Reader to read input from.
   */
  public DTDTokenizer(java.io.Reader in) {
    this.yy_reader = in;
  }

  /**
   * Creates a new scanner.
   * There is also java.io.Reader version of this constructor.
   *
   * @param   in  the java.io.Inputstream to read input from.
   */
  public DTDTokenizer(java.io.InputStream in) {
    this(new java.io.InputStreamReader(in));
  }

  /** 
   * Unpacks the split, compressed DFA transition table.
   *
   * @return the unpacked transition table
   */
  private static int [] yy_unpack() {
    int [] trans = new int[6630];
    int offset = 0;
    offset = yy_unpack(yy_packed0, offset, trans);
    return trans;
  }

  /** 
   * Unpacks the compressed DFA transition table.
   *
   * @param packed   the packed transition table
   * @return         the index of the last entry
   */
  private static int yy_unpack(String packed, int offset, int [] trans) {
    int i = 0;       /* index in packed string  */
    int j = offset;  /* index in unpacked array */
    int l = packed.length();
    while (i < l) {
      int count = packed.charAt(i++);
      int value = packed.charAt(i++);
      value--;
      do trans[j++] = value; while (--count > 0);
    }
    return j;
  }

  /** 
   * Unpacks the compressed character translation table.
   *
   * @param packed   the packed character translation table
   * @return         the unpacked character translation table
   */
  private static char [] yy_unpack_cmap(String packed) {
    char [] map = new char[0x10000];
    int i = 0;  /* index in packed string  */
    int j = 0;  /* index in unpacked array */
    while (i < 130) {
      int  count = packed.charAt(i++);
      char value = packed.charAt(i++);
      do map[j++] = value; while (--count > 0);
    }
    return map;
  }


  /**
   * Refills the input buffer.
   *
   * @return      <code>false</code>, iff there was new input.
   * 
   * @exception   java.io.IOException  if any I/O-Error occurs
   */
  private boolean yy_refill() throws java.io.IOException {

    /* first: make room (if you can) */
    if (yy_startRead > 0) {
      System.arraycopy(yy_buffer, yy_startRead, 
                       yy_buffer, 0, 
                       yy_endRead-yy_startRead);

      /* translate stored positions */
      yy_endRead-= yy_startRead;
      yy_currentPos-= yy_startRead;
      yy_markedPos-= yy_startRead;
      //yy_pushbackPos-= yy_startRead;
      yy_startRead = 0;
    }

    /* is the buffer big enough? */
    if (yy_currentPos >= yy_buffer.length) {
      /* if not: blow it up */
      char newBuffer[] = new char[yy_currentPos*2];
      System.arraycopy(yy_buffer, 0, newBuffer, 0, yy_buffer.length);
      yy_buffer = newBuffer;
    }

    /* finally: fill the buffer with new input */
    int numRead = yy_reader.read(yy_buffer, yy_endRead, 
                                            yy_buffer.length-yy_endRead);

    if (numRead < 0) {
      return true;
    }
    else {
      yy_endRead+= numRead;  
      return false;
    }
  }

    
  /**
   * Closes the input stream.
   */
  final public void yyclose() throws java.io.IOException {
    yy_atEOF = true;            /* indicate end of file */
    yy_endRead = yy_startRead;  /* invalidate buffer    */

    if (yy_reader != null)
      yy_reader.close();
  }


  /**
   * Closes the current stream, and resets the
   * scanner to read from a new input stream.
   *
   * All internal variables are reset, the old input stream 
   * <b>cannot</b> be reused (internal buffer is discarded and lost).
   * Lexical state is set to <tt>YY_INITIAL</tt>.
   *
   * @param reader   the new input stream 
   */
  final public void yyreset(java.io.Reader reader) throws java.io.IOException {
    yyclose();
    yy_reader = reader;
    yy_atEOF  = false;
    yy_endRead = yy_startRead = 0;
    yy_currentPos = yy_markedPos = 0;//yy_pushbackPos = 0;
    yyline = yychar = yycolumn = 0;
    yy_lexical_state = YYINITIAL;
  }


  /**
   * Returns the current lexical state.
   */
  final public int yystate() {
    return yy_lexical_state;
  }


  /**
   * Enters a new lexical state
   *
   * @param newState the new lexical state
   */
  final public void yybegin(int newState) {
    yy_lexical_state = newState;
  }


  /**
   * Returns the text matched by the current regular expression.
   */
  final public String yytext() {
    return new String( yy_buffer, yy_startRead, yy_markedPos-yy_startRead );
  }


  /**
   * Returns the character at position <tt>pos</tt> from the 
   * matched text. 
   * 
   * It is equivalent to yytext().charAt(pos), but faster
   *
   * @param pos the position of the character to fetch. 
   *            A value from 0 to yylength()-1.
   *
   * @return the character at position pos
   */
  final public char yycharat(int pos) {
    return yy_buffer[yy_startRead+pos];
  }


  /**
   * Returns the length of the matched text region.
   */
  final public int yylength() {
    return yy_markedPos-yy_startRead;
  }


  /**
   * Reports an error that occured while scanning.
   *
   * In a wellformed scanner (no or only correct usage of 
   * yypushback(int) and a match-all fallback rule) this method 
   * will only be called with things that "Can't Possibly Happen".
   * If this method is called, something is seriously wrong
   * (e.g. a JFlex bug producing a faulty scanner etc.).
   *
   * Usual syntax/scanner level error handling should be done
   * in error fallback rules.
   *
   * @param   errorCode  the code of the errormessage to display
   */
  private void yy_ScanError(int errorCode) {
    String message;
    try {
      message = YY_ERROR_MSG[errorCode];
    }
    catch (ArrayIndexOutOfBoundsException e) {
      message = YY_ERROR_MSG[YY_UNKNOWN_ERROR];
    }

    throw new Error(message);
  } 


  /**
   * Pushes the specified amount of characters back into the input stream.
   *
   * They will be read again by then next call of the scanning method
   *
   * @param number  the number of characters to be read again.
   *                This number must not be greater than yylength()!
   */
  private void yypushback(int number)  {
    if ( number > yylength() )
      yy_ScanError(YY_PUSHBACK_2BIG);

    yy_markedPos -= number;
  }


  /**
   * Resumes scanning until the next regular expression is matched,
   * the end of input is encountered or an I/O-Error occurs.
   *
   * @return      the next token
   * @exception   java.io.IOException  if any I/O-Error occurs
   */
  public Yytoken yylex() throws java.io.IOException {
    int yy_input;
    int yy_action;

    // cached fields:
    int yy_currentPos_l;
    int yy_markedPos_l;
    int yy_endRead_l = yy_endRead;
    char [] yy_buffer_l = yy_buffer;
    char [] yycmap_l = yycmap;

    int [] yytrans_l = yytrans;
    int [] yy_rowMap_l = yy_rowMap;
    byte [] yy_attr_l = YY_ATTRIBUTE;

    while (true) {
      yy_markedPos_l = yy_markedPos;

      yychar+= yy_markedPos_l-yy_startRead;

      yy_action = -1;

      yy_currentPos_l = yy_currentPos = 
                       yy_startRead = yy_markedPos_l;
  
      yy_state = yy_lexical_state;


      yy_forAction: {
        while (true) {
    
          if (yy_currentPos_l < yy_endRead_l)
            yy_input = yy_buffer_l[yy_currentPos_l++];
          else if (yy_atEOF) {
            yy_input = YYEOF;
            break yy_forAction;
          }
          else {
            // store back cached positions
            yy_currentPos  = yy_currentPos_l;
            yy_markedPos   = yy_markedPos_l;
            boolean eof = yy_refill();
            // get translated positions and possibly new buffer
            yy_currentPos_l  = yy_currentPos;
            yy_markedPos_l   = yy_markedPos;
            yy_buffer_l      = yy_buffer;
            yy_endRead_l     = yy_endRead;
            if (eof) {
              yy_input = YYEOF;
              break yy_forAction;
            }
            else {
              yy_input = yy_buffer_l[yy_currentPos_l++];
            }
          }
          int yy_next = yytrans_l[ yy_rowMap_l[yy_state] + yycmap_l[yy_input] ];
          if (yy_next == -1) break yy_forAction;
          yy_state = yy_next;

          int yy_attributes = yy_attr_l[yy_state];
          if ( (yy_attributes & 1) == 1 ) {
            yy_action = yy_state; 
            yy_markedPos_l = yy_currentPos_l; 
            if ( (yy_attributes & 8) == 8 ) break yy_forAction;
          }

        }
      }

      // store back cached position
      yy_markedPos = yy_markedPos_l;

      switch (yy_action) {

        case 26: 
          {  yypushback(yylength()); yybegin(YYINITIAL);  }
        case 219: break;
        case 89: 
        case 123: 
          {  yypushback(yylength()); yybegin(ATTRIBUTE_DEFAULT);  }
        case 220: break;
        case 12: 
        case 62: 
        case 63: 
        case 64: 
        case 65: 
        case 102: 
        case 103: 
        case 104: 
        case 133: 
        case 134: 
        case 135: 
        case 156: 
        case 157: 
        case 158: 
        case 178: 
        case 179: 
        case 180: 
        case 196: 
        case 197: 
        case 207: 
        case 208: 
        case 215: 
          {  yypushback(yylength()); yybegin(ATTLIST_CONTENT);  }
        case 221: break;
        case 51: 
        case 52: 
          {  yypushback(yylength()); yybegin(ATTLIST_CONTENT);  }
        case 222: break;
        case 205: 
          {  yybegin(ATTRIBUTE_DEFAULT); return createToken(DTDRegionTypes.NMTOKEN_KEYWORD);  }
        case 223: break;
        case 194: 
          {  yybegin(ATTRIBUTE_DEFAULT); return createToken(DTDRegionTypes.IDREFS_KEYWORD);  }
        case 224: break;
        case 191: 
          {  yybegin(ATTRIBUTE_DEFAULT); return createToken(DTDRegionTypes.ENTITY_KEYWORD);  }
        case 225: break;
        case 107: 
          {  yybegin(COMMENT_CONTENT); return createToken(DTDRegionTypes.COMMENT_START);  }
        case 226: break;
        case 48: 
          {  yybegin(ATTRIBUTE_CONTENT); return createToken(DTDRegionTypes.ATTRIBUTE_NAME);  }
        case 227: break;
        case 39: 
          {  yybegin(EXTERNALID_CONTENT); return createToken(DTDRegionTypes.NAME);  }
        case 228: break;
        case 106: 
        case 136: 
          {  yybegin(ATTLIST_CONTENT); return createToken(DTDRegionTypes.SINGLEQUOTED_LITERAL);  }
        case 229: break;
        case 100: 
        case 132: 
          {  yybegin(ATTLIST_CONTENT); return createToken(DTDRegionTypes.DOUBLEQUOTED_LITERAL);  }
        case 230: break;
        case 202: 
        case 216: 
          {  return createToken(DTDRegionTypes.CONTENT_PCDATA);  }
        case 231: break;
        case 189: 
          {  return createToken(DTDRegionTypes.PUBLIC_KEYWORD);  }
        case 232: break;
        case 188: 
          {  return createToken(DTDRegionTypes.SYSTEM_KEYWORD);  }
        case 233: break;
        case 14: 
        case 20: 
        case 21: 
        case 23: 
        case 71: 
        case 72: 
        case 73: 
        case 75: 
        case 108: 
        case 109: 
        case 110: 
        case 112: 
        case 137: 
        case 138: 
        case 139: 
        case 140: 
        case 159: 
        case 160: 
        case 161: 
        case 162: 
        case 181: 
        case 183: 
        case 184: 
        case 200: 
          {  return createToken(DTDRegionTypes.UNKNOWN_CONTENT);  }
        case 234: break;
        case 4: 
        case 33: 
        case 34: 
        case 35: 
        case 36: 
        case 37: 
        case 81: 
        case 82: 
        case 116: 
        case 117: 
        case 143: 
        case 144: 
        case 165: 
        case 166: 
          {  return createToken(DTDRegionTypes.UNKNOWN_CONTENT);  }
        case 235: break;
        case 7: 
        case 40: 
        case 41: 
        case 42: 
        case 85: 
        case 86: 
        case 87: 
        case 119: 
        case 120: 
        case 121: 
        case 145: 
        case 146: 
        case 147: 
        case 168: 
        case 169: 
          {  return createToken(DTDRegionTypes.UNKNOWN_CONTENT);  }
        case 236: break;
        case 9: 
          {  return createToken(DTDRegionTypes.UNKNOWN_CONTENT);  }
        case 237: break;
        case 10: 
          {  return createToken(DTDRegionTypes.UNKNOWN_CONTENT);  }
        case 238: break;
        case 43: 
        case 45: 
        case 46: 
          {  return createToken(DTDRegionTypes.COMMENT_CONTENT);  }
        case 239: break;
        case 60: 
          {  return createToken(DTDRegionTypes.UNKNOWN_CONTENT);  }
        case 240: break;
        case 198: 
          {  return createToken(DTDRegionTypes.FIXED_KEYWORD);  }
        case 241: break;
        case 214: 
          {  yybegin(ATTLIST_CONTENT); return createToken(DTDRegionTypes.IMPLIED_KEYWORD);  }
        case 242: break;
        case 212: 
          {  yybegin(ATTRIBUTE_DEFAULT); return createToken(DTDRegionTypes.NMTOKENS_KEYWORD);  }
        case 243: break;
        case 211: 
          {  yybegin(ATTRIBUTE_DEFAULT); return createToken(DTDRegionTypes.ENTITIES_KEYWORD);  }
        case 244: break;
        case 209: 
          {  yybegin(NOTATION_NAME); return createToken(DTDRegionTypes.NOTATION_TAG);  }
        case 245: break;
        case 201: 
          {  yybegin(ATTLIST_NAME); return createToken(DTDRegionTypes.ATTLIST_TAG);  }
        case 246: break;
        case 199: 
          {  yybegin(ELEMENT_NAME); return createToken(DTDRegionTypes.ELEMENT_TAG);  }
        case 247: break;
        case 182: 
          {  yybegin(ENTITY_NAME); return createToken(DTDRegionTypes.ENTITY_TAG);  }
        case 248: break;
        case 167: 
          {  yybegin(NDATA_CONTENT); return createToken(DTDRegionTypes.NDATA_KEYWORD);  }
        case 249: break;
        case 111: 
          {  return createToken(DTDRegionTypes.ENTITY_PARM);  }
        case 250: break;
        case 94: 
          {  yybegin(ATTRIBUTE_DEFAULT); return createToken(DTDRegionTypes.ID_KEYWORD);  }
        case 251: break;
        case 25: 
          {  return createToken(DTDRegionTypes.OCCUR_TYPE);  }
        case 252: break;
        case 16: 
          {  return createToken(DTDRegionTypes.EXCLAMATION);  }
        case 253: break;
        case 15: 
          {  return createToken(DTDRegionTypes.WHITESPACE);  }
        case 254: break;
        case 11: 
        case 49: 
        case 50: 
        case 54: 
        case 55: 
        case 56: 
        case 57: 
        case 58: 
        case 61: 
        case 91: 
        case 92: 
        case 93: 
        case 95: 
        case 96: 
        case 97: 
        case 98: 
        case 124: 
        case 125: 
        case 126: 
        case 127: 
        case 128: 
        case 129: 
        case 130: 
        case 131: 
        case 148: 
        case 149: 
        case 150: 
        case 151: 
        case 152: 
        case 153: 
        case 154: 
        case 155: 
        case 170: 
        case 171: 
        case 172: 
        case 175: 
        case 176: 
        case 177: 
        case 190: 
        case 192: 
        case 193: 
        case 195: 
        case 204: 
        case 206: 
          {  yybegin(ATTRIBUTE_DEFAULT); return createToken(DTDRegionTypes.PARM_ENTITY_TYPE);  }
        case 255: break;
        case 28: 
          {  return createToken(DTDRegionTypes.LEFT_PAREN);  }
        case 256: break;
        case 29: 
          {  return createToken(DTDRegionTypes.RIGHT_PAREN);  }
        case 257: break;
        case 44: 
          {  return createToken(DTDRegionTypes.WHITESPACE);  }
        case 258: break;
        case 53: 
          {  return createToken(DTDRegionTypes.WHITESPACE);  }
        case 259: break;
        case 59: 
          {  yypushback(yylength()); yybegin(ATTRIBUTE_ENUMERATION);  }
        case 260: break;
        case 67: 
          {  return createToken(DTDRegionTypes.LEFT_PAREN);  }
        case 261: break;
        case 68: 
          {  yybegin(ATTRIBUTE_DEFAULT); return createToken(DTDRegionTypes.RIGHT_PAREN);  }
        case 262: break;
        case 69: 
          {  return createToken(DTDRegionTypes.ENUM_CHOICE);  }
        case 263: break;
        case 31: 
          {  yybegin(ENTITY_CONTENT); return createToken(DTDRegionTypes.NAME);  }
        case 264: break;
        case 47: 
          {  yybegin(ATTLIST_CONTENT); return createToken(DTDRegionTypes.NAME);  }
        case 265: break;
        case 187: 
          {  yypushback(yylength()); yybegin(EXTERNALID_CONTENT);  }
        case 266: break;
        case 213: 
          {  yybegin(ATTRIBUTE_ENUMERATION); return createToken(DTDRegionTypes.NOTATION_KEYWORD);  }
        case 267: break;
        case 174: 
          {  yybegin(ATTRIBUTE_DEFAULT); return createToken(DTDRegionTypes.CDATA_KEYWORD);  }
        case 268: break;
        case 173: 
          {  yybegin(ATTRIBUTE_DEFAULT); return createToken(DTDRegionTypes.IDREF_KEYWORD);  }
        case 269: break;
        case 217: 
          {  yybegin(ATTLIST_CONTENT); return createToken(DTDRegionTypes.REQUIRED_KEYWORD);  }
        case 270: break;
        case 122: 
          {  yybegin(YYINITIAL); return createToken(DTDRegionTypes.COMMENT_END);  }
        case 271: break;
        case 84: 
        case 118: 
          {  return createToken(DTDRegionTypes.SINGLEQUOTED_LITERAL);  }
        case 272: break;
        case 79: 
        case 115: 
          {  return createToken(DTDRegionTypes.DOUBLEQUOTED_LITERAL);  }
        case 273: break;
        case 24: 
        case 27: 
        case 76: 
        case 113: 
        case 141: 
        case 163: 
        case 185: 
          {  return createToken(DTDRegionTypes.NAME);  }
        case 274: break;
        case 5: 
        case 38: 
          {  yybegin(YYINITIAL); return createToken(DTDRegionTypes.NDATA_VALUE);  }
        case 275: break;
        case 13: 
        case 66: 
          {  return createToken(DTDRegionTypes.NAME);  }
        case 276: break;
        case 18: 
          {  return createToken(DTDRegionTypes.START_TAG);  }
        case 277: break;
        case 17: 
          {  return createToken(DTDRegionTypes.SEMICOLON);  }
        case 278: break;
        case 30: 
          {  return createToken(DTDRegionTypes.CONNECTOR);  }
        case 279: break;
        case 22: 
          {  return createToken(DTDRegionTypes.PERCENT);  }
        case 280: break;
        case 19: 
          {  return createToken(DTDRegionTypes.END_TAG);  }
        case 281: break;
        case 32: 
          {  return createToken(DTDRegionTypes.PERCENT);  }
        case 282: break;
        default: 
          if (yy_input == YYEOF && yy_startRead == yy_currentPos) {
            yy_atEOF = true;
            return null;
          } 
          else {
            yy_ScanError(YY_NO_MATCH);
          }
      }
    }
  }


}
