/* The following code was generated by JFlex 1.3.5 on 3/14/05 9:37 PM */

/*******************************************************************************
 * Copyright (c) 2001, 2004 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
 *     
 *******************************************************************************/

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 = 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);
          }
      }
    }
  }


}
