/*******************************************************************************
 * 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.tokenizer;

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



/**
 * This class is a scanner generated by <a href="http://www.jflex.de/">JFlex
 * </a> 1.3.5 on 05/04/02 11:38 AM from the specification file
 * <tt>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;
	final  static String yy_NL = System.getProperty("line.separator");

	/** 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_atBOL == true <=>the scanner is currently at the beginning of a
	 * line
	 */
	 boolean yy_atBOL = true;

	/** 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 startOffset) {
		this.startOffset = startOffset;
	}

	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_atBOL = true;
		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 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_startRead_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;

			boolean yy_r = false;
			for (yy_currentPos_l = yy_startRead; yy_currentPos_l < yy_markedPos_l; yy_currentPos_l++) {
				switch (yy_buffer_l[yy_currentPos_l]) {
					case '\u000B' :
					case '\u000C' :
					case '\u0085' :
					case '\u2028' :
					case '\u2029' :
						yyline++;
						yy_r = false;
						break;
					case '\r' :
						yyline++;
						yy_r = true;
						break;
					case '\n' :
						if (yy_r)
							yy_r = false;
						else {
							yyline++;
						}
						break;
					default :
						yy_r = false;
				}
			}

			if (yy_r) {
				// peek one character ahead if it is \n (if we have counted
				// one line too much)
				boolean yy_peek;
				if (yy_markedPos_l < yy_endRead_l)
					yy_peek = yy_buffer_l[yy_markedPos_l] == '\n';
				else if (yy_atEOF)
					yy_peek = false;
				else {
					boolean eof = yy_refill();
					yy_markedPos_l = yy_markedPos;
					yy_buffer_l = yy_buffer;
					if (eof)
						yy_peek = false;
					else
						yy_peek = yy_buffer_l[yy_markedPos_l] == '\n';
				}
				if (yy_peek)
					yyline--;
			}
			yy_action = -1;

			yy_startRead_l = 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 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [197] { yypushback(yylength());
				// yybegin(YYINITIAL); }");
				{
					yypushback(yylength());
					yybegin(YYINITIAL);
				}
				case 219 :
					break;
				case 89 :
				case 123 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [231] { yypushback(yylength());
				// yybegin(ATTRIBUTE_DEFAULT); }");
				{
					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 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [247] { yypushback(yylength());
				// yybegin(ATTLIST_CONTENT); }");
				{
					yypushback(yylength());
					yybegin(ATTLIST_CONTENT);
				}
				case 221 :
					break;
				case 51 :
				case 52 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [217] { yypushback(yylength());
				// yybegin(ATTLIST_CONTENT); }");
				{
					yypushback(yylength());
					yybegin(ATTLIST_CONTENT);
				}
				case 222 :
					break;
				case 205 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [227] {
				// yybegin(ATTRIBUTE_DEFAULT); return
				// createToken(DTDRegionTypes.NMTOKEN_KEYWORD); }");
				{
					yybegin(ATTRIBUTE_DEFAULT);
					return createToken(DTDRegionTypes.NMTOKEN_KEYWORD);
				}
				case 223 :
					break;
				case 194 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [224] {
				// yybegin(ATTRIBUTE_DEFAULT); return
				// createToken(DTDRegionTypes.IDREFS_KEYWORD); }");
				{
					yybegin(ATTRIBUTE_DEFAULT);
					return createToken(DTDRegionTypes.IDREFS_KEYWORD);
				}
				case 224 :
					break;
				case 191 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [225] {
				// yybegin(ATTRIBUTE_DEFAULT); return
				// createToken(DTDRegionTypes.ENTITY_KEYWORD); }");
				{
					yybegin(ATTRIBUTE_DEFAULT);
					return createToken(DTDRegionTypes.ENTITY_KEYWORD);
				}
				case 225 :
					break;
				case 107 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [174] {
				// yybegin(COMMENT_CONTENT); return
				// createToken(DTDRegionTypes.COMMENT_START); }");
				{
					yybegin(COMMENT_CONTENT);
					return createToken(DTDRegionTypes.COMMENT_START);
				}
				case 226 :
					break;
				case 48 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [211] {
				// yybegin(ATTRIBUTE_CONTENT); return
				// createToken(DTDRegionTypes.ATTRIBUTE_NAME); }");
				{
					yybegin(ATTRIBUTE_CONTENT);
					return createToken(DTDRegionTypes.ATTRIBUTE_NAME);
				}
				case 227 :
					break;
				case 39 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [283] {
				// yybegin(EXTERNALID_CONTENT); return
				// createToken(DTDRegionTypes.NAME); }");
				{
					yybegin(EXTERNALID_CONTENT);
					return createToken(DTDRegionTypes.NAME);
				}
				case 228 :
					break;
				case 106 :
				case 136 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [245] {
				// yybegin(ATTLIST_CONTENT); return
				// createToken(DTDRegionTypes.SINGLEQUOTED_LITERAL); }");
				{
					yybegin(ATTLIST_CONTENT);
					return createToken(DTDRegionTypes.SINGLEQUOTED_LITERAL);
				}
				case 229 :
					break;
				case 100 :
				case 132 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [246] {
				// yybegin(ATTLIST_CONTENT); return
				// createToken(DTDRegionTypes.DOUBLEQUOTED_LITERAL); }");
				{
					yybegin(ATTLIST_CONTENT);
					return createToken(DTDRegionTypes.DOUBLEQUOTED_LITERAL);
				}
				case 230 :
					break;
				case 202 :
				case 216 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [189] { return
				// createToken(DTDRegionTypes.CONTENT_PCDATA); }");
				{
					return createToken(DTDRegionTypes.CONTENT_PCDATA);
				}
				case 231 :
					break;
				case 189 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [290] { return
				// createToken(DTDRegionTypes.PUBLIC_KEYWORD); }");
				{
					return createToken(DTDRegionTypes.PUBLIC_KEYWORD);
				}
				case 232 :
					break;
				case 188 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [289] { return
				// createToken(DTDRegionTypes.SYSTEM_KEYWORD); }");
				{
					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 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [182] { return
				// createToken(DTDRegionTypes.UNKNOWN_CONTENT); }");
				{
					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 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [275] { return
				// createToken(DTDRegionTypes.UNKNOWN_CONTENT); }");
				{
					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 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [294] { return
				// createToken(DTDRegionTypes.UNKNOWN_CONTENT); }");
				{
					return createToken(DTDRegionTypes.UNKNOWN_CONTENT);
				}
				case 236 :
					break;
				case 9 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [205] { return
				// createToken(DTDRegionTypes.UNKNOWN_CONTENT); }");
				{
					return createToken(DTDRegionTypes.UNKNOWN_CONTENT);
				}
				case 237 :
					break;
				case 10 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [212] { return
				// createToken(DTDRegionTypes.UNKNOWN_CONTENT); }");
				{
					return createToken(DTDRegionTypes.UNKNOWN_CONTENT);
				}
				case 238 :
					break;
				case 43 :
				case 45 :
				case 46 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [309] { return
				// createToken(DTDRegionTypes.COMMENT_CONTENT); }");
				{
					return createToken(DTDRegionTypes.COMMENT_CONTENT);
				}
				case 239 :
					break;
				case 60 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [236] { return
				// createToken(DTDRegionTypes.UNKNOWN_CONTENT); }");
				{
					return createToken(DTDRegionTypes.UNKNOWN_CONTENT);
				}
				case 240 :
					break;
				case 198 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [244] { return
				// createToken(DTDRegionTypes.FIXED_KEYWORD); }");
				{
					return createToken(DTDRegionTypes.FIXED_KEYWORD);
				}
				case 241 :
					break;
				case 214 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [243] {
				// yybegin(ATTLIST_CONTENT); return
				// createToken(DTDRegionTypes.IMPLIED_KEYWORD); }");
				{
					yybegin(ATTLIST_CONTENT);
					return createToken(DTDRegionTypes.IMPLIED_KEYWORD);
				}
				case 242 :
					break;
				case 212 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [228] {
				// yybegin(ATTRIBUTE_DEFAULT); return
				// createToken(DTDRegionTypes.NMTOKENS_KEYWORD); }");
				{
					yybegin(ATTRIBUTE_DEFAULT);
					return createToken(DTDRegionTypes.NMTOKENS_KEYWORD);
				}
				case 243 :
					break;
				case 211 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [226] {
				// yybegin(ATTRIBUTE_DEFAULT); return
				// createToken(DTDRegionTypes.ENTITIES_KEYWORD); }");
				{
					yybegin(ATTRIBUTE_DEFAULT);
					return createToken(DTDRegionTypes.ENTITIES_KEYWORD);
				}
				case 244 :
					break;
				case 209 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [176] { yybegin(NOTATION_NAME);
				// return createToken(DTDRegionTypes.NOTATION_TAG); }");
				{
					yybegin(NOTATION_NAME);
					return createToken(DTDRegionTypes.NOTATION_TAG);
				}
				case 245 :
					break;
				case 201 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [177] { yybegin(ATTLIST_NAME);
				// return createToken(DTDRegionTypes.ATTLIST_TAG); }");
				{
					yybegin(ATTLIST_NAME);
					return createToken(DTDRegionTypes.ATTLIST_TAG);
				}
				case 246 :
					break;
				case 199 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [173] { yybegin(ELEMENT_NAME);
				// return createToken(DTDRegionTypes.ELEMENT_TAG); }");
				{
					yybegin(ELEMENT_NAME);
					return createToken(DTDRegionTypes.ELEMENT_TAG);
				}
				case 247 :
					break;
				case 182 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [175] { yybegin(ENTITY_NAME);
				// return createToken(DTDRegionTypes.ENTITY_TAG); }");
				{
					yybegin(ENTITY_NAME);
					return createToken(DTDRegionTypes.ENTITY_TAG);
				}
				case 248 :
					break;
				case 167 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [293] { yybegin(NDATA_CONTENT);
				// return createToken(DTDRegionTypes.NDATA_KEYWORD); }");
				{
					yybegin(NDATA_CONTENT);
					return createToken(DTDRegionTypes.NDATA_KEYWORD);
				}
				case 249 :
					break;
				case 111 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [179] { return
				// createToken(DTDRegionTypes.ENTITY_PARM); }");
				{
					return createToken(DTDRegionTypes.ENTITY_PARM);
				}
				case 250 :
					break;
				case 94 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [222] {
				// yybegin(ATTRIBUTE_DEFAULT); return
				// createToken(DTDRegionTypes.ID_KEYWORD); }");
				{
					yybegin(ATTRIBUTE_DEFAULT);
					return createToken(DTDRegionTypes.ID_KEYWORD);
				}
				case 251 :
					break;
				case 25 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [194] { return
				// createToken(DTDRegionTypes.OCCUR_TYPE); }");
				{
					return createToken(DTDRegionTypes.OCCUR_TYPE);
				}
				case 252 :
					break;
				case 16 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [169] { return
				// createToken(DTDRegionTypes.EXCLAMATION); }");
				{
					return createToken(DTDRegionTypes.EXCLAMATION);
				}
				case 253 :
					break;
				case 15 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [184] { return
				// createToken(DTDRegionTypes.WHITESPACE); }");
				{
					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 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [235] {
				// yybegin(ATTRIBUTE_DEFAULT); return
				// createToken(DTDRegionTypes.PARM_ENTITY_TYPE); }");
				{
					yybegin(ATTRIBUTE_DEFAULT);
					return createToken(DTDRegionTypes.PARM_ENTITY_TYPE);
				}
				case 255 :
					break;
				case 28 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [192] { return
				// createToken(DTDRegionTypes.LEFT_PAREN); }");
				{
					return createToken(DTDRegionTypes.LEFT_PAREN);
				}
				case 256 :
					break;
				case 29 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [195] { return
				// createToken(DTDRegionTypes.RIGHT_PAREN); }");
				{
					return createToken(DTDRegionTypes.RIGHT_PAREN);
				}
				case 257 :
					break;
				case 44 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [308] { return
				// createToken(DTDRegionTypes.WHITESPACE); }");
				{
					return createToken(DTDRegionTypes.WHITESPACE);
				}
				case 258 :
					break;
				case 53 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [218] { return
				// createToken(DTDRegionTypes.WHITESPACE); }");
				{
					return createToken(DTDRegionTypes.WHITESPACE);
				}
				case 259 :
					break;
				case 59 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [234] { yypushback(yylength());
				// yybegin(ATTRIBUTE_ENUMERATION); }");
				{
					yypushback(yylength());
					yybegin(ATTRIBUTE_ENUMERATION);
				}
				case 260 :
					break;
				case 67 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [253] { return
				// createToken(DTDRegionTypes.LEFT_PAREN); }");
				{
					return createToken(DTDRegionTypes.LEFT_PAREN);
				}
				case 261 :
					break;
				case 68 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [255] {
				// yybegin(ATTRIBUTE_DEFAULT); return
				// createToken(DTDRegionTypes.RIGHT_PAREN); }");
				{
					yybegin(ATTRIBUTE_DEFAULT);
					return createToken(DTDRegionTypes.RIGHT_PAREN);
				}
				case 262 :
					break;
				case 69 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [254] { return
				// createToken(DTDRegionTypes.ENUM_CHOICE); }");
				{
					return createToken(DTDRegionTypes.ENUM_CHOICE);
				}
				case 263 :
					break;
				case 31 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [265] { yybegin(ENTITY_CONTENT);
				// return createToken(DTDRegionTypes.NAME); }");
				{
					yybegin(ENTITY_CONTENT);
					return createToken(DTDRegionTypes.NAME);
				}
				case 264 :
					break;
				case 47 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [204] {
				// yybegin(ATTLIST_CONTENT); return
				// createToken(DTDRegionTypes.NAME); }");
				{
					yybegin(ATTLIST_CONTENT);
					return createToken(DTDRegionTypes.NAME);
				}
				case 265 :
					break;
				case 187 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [272] { yypushback(yylength());
				// yybegin(EXTERNALID_CONTENT); }");
				{
					yypushback(yylength());
					yybegin(EXTERNALID_CONTENT);
				}
				case 266 :
					break;
				case 213 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [229] {
				// yybegin(ATTRIBUTE_ENUMERATION); return
				// createToken(DTDRegionTypes.NOTATION_KEYWORD); }");
				{
					yybegin(ATTRIBUTE_ENUMERATION);
					return createToken(DTDRegionTypes.NOTATION_KEYWORD);
				}
				case 267 :
					break;
				case 174 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [220] {
				// yybegin(ATTRIBUTE_DEFAULT); return
				// createToken(DTDRegionTypes.CDATA_KEYWORD); }");
				{
					yybegin(ATTRIBUTE_DEFAULT);
					return createToken(DTDRegionTypes.CDATA_KEYWORD);
				}
				case 268 :
					break;
				case 173 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [223] {
				// yybegin(ATTRIBUTE_DEFAULT); return
				// createToken(DTDRegionTypes.IDREF_KEYWORD); }");
				{
					yybegin(ATTRIBUTE_DEFAULT);
					return createToken(DTDRegionTypes.IDREF_KEYWORD);
				}
				case 269 :
					break;
				case 217 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [242] {
				// yybegin(ATTLIST_CONTENT); return
				// createToken(DTDRegionTypes.REQUIRED_KEYWORD); }");
				{
					yybegin(ATTLIST_CONTENT);
					return createToken(DTDRegionTypes.REQUIRED_KEYWORD);
				}
				case 270 :
					break;
				case 122 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [307] { yybegin(YYINITIAL);
				// return createToken(DTDRegionTypes.COMMENT_END); }");
				{
					yybegin(YYINITIAL);
					return createToken(DTDRegionTypes.COMMENT_END);
				}
				case 271 :
					break;
				case 84 :
				case 118 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [273] { return
				// createToken(DTDRegionTypes.SINGLEQUOTED_LITERAL); }");
				{
					return createToken(DTDRegionTypes.SINGLEQUOTED_LITERAL);
				}
				case 272 :
					break;
				case 79 :
				case 115 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [274] { return
				// createToken(DTDRegionTypes.DOUBLEQUOTED_LITERAL); }");
				{
					return createToken(DTDRegionTypes.DOUBLEQUOTED_LITERAL);
				}
				case 273 :
					break;
				case 24 :
				case 27 :
				case 76 :
				case 113 :
				case 141 :
				case 163 :
				case 185 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [190] { return
				// createToken(DTDRegionTypes.NAME); }");
				{
					return createToken(DTDRegionTypes.NAME);
				}
				case 274 :
					break;
				case 5 :
				case 38 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [300] { yybegin(YYINITIAL);
				// return createToken(DTDRegionTypes.NDATA_VALUE); }");
				{
					yybegin(YYINITIAL);
					return createToken(DTDRegionTypes.NDATA_VALUE);
				}
				case 275 :
					break;
				case 13 :
				case 66 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [256] { return
				// createToken(DTDRegionTypes.NAME); }");
				{
					return createToken(DTDRegionTypes.NAME);
				}
				case 276 :
					break;
				case 18 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [167] { return
				// createToken(DTDRegionTypes.START_TAG); }");
				{
					return createToken(DTDRegionTypes.START_TAG);
				}
				case 277 :
					break;
				case 17 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [171] { return
				// createToken(DTDRegionTypes.SEMICOLON); }");
				{
					return createToken(DTDRegionTypes.SEMICOLON);
				}
				case 278 :
					break;
				case 30 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [193] { return
				// createToken(DTDRegionTypes.CONNECTOR); }");
				{
					return createToken(DTDRegionTypes.CONNECTOR);
				}
				case 279 :
					break;
				case 22 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [170] { return
				// createToken(DTDRegionTypes.PERCENT); }");
				{
					return createToken(DTDRegionTypes.PERCENT);
				}
				case 280 :
					break;
				case 19 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [168] { return
				// createToken(DTDRegionTypes.END_TAG); }");
				{
					return createToken(DTDRegionTypes.END_TAG);
				}
				case 281 :
					break;
				case 32 :
				//System.out.println("line: "+(yyline+1)+" "+"match:
				// --"+yytext()+"--");
				//System.out.println("action [264] { return
				// createToken(DTDRegionTypes.PERCENT); }");
				{
					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);
					}
			}
		}
	}

	/**
	 * Runs the scanner on input files.
	 * 
	 * This main method is the debugging routine for the scanner. It prints
	 * debugging information about each returned token to System.out until the
	 * end of file is reached, or an error occured.
	 * 
	 * @param argv
	 *            the command line, contains the filenames to run the scanner
	 *            on.
	 */
	public static void main(String argv[]) {
		if (argv.length == 0) {
			System.out.println("Usage : java DTDTokenizer <inputfile>");
		} else {
			for (int i = 0; i < argv.length; i++) {
				DTDTokenizer scanner = null;
				try {
					scanner = new DTDTokenizer(new java.io.FileReader(argv[i]));
					do {
						System.out.println(scanner.yylex());
					} while (!scanner.yy_atEOF);

				} catch (java.io.FileNotFoundException e) {
					System.out.println("File not found : \"" + argv[i] + "\"");
				} catch (java.io.IOException e) {
					System.out.println("IO error scanning file \"" + argv[i] + "\"");
					System.out.println(e);
				} catch (Exception e) {
					System.out.println("Unexpected exception:");
					e.printStackTrace();
				}
			}
		}
	}


}
