content: /* The following code was generated by JFlex 1.6.1 */
  
  package com.myopicmobile.textwarrior.common;
  
  import java.util.*;
  import java.lang.reflect.Field;
  import java.io.*;
  
  
  /**
   * This class is a scanner generated by 
   * <a href="http://www.jflex.de/">JFlex</a> 1.6.1
   */
  public class LuaLexer
  {
  
  	/** This character denotes the end of file */
  	public static final int YYEOF = -1;
  
  	/** initial size of the lookahead buffer */
  	private static final int ZZ_BUFFERSIZE = 16384;
  
  	/** lexical states */
  	public static final int YYINITIAL = 0;
  	public static final int XLONGSTRING = 2;
  	public static final int XLONGSTRING_BEGIN = 4;
  	public static final int XSHORTCOMMENT = 6;
  	public static final int XLONGCOMMENT = 8;
  	public static final int XSTRINGQ = 10;
  	public static final int XSTRINGA = 12;
  
  	/**
  	 * ZZ_LEXSTATE[l] is the state in the DFA for the lexical state l
  	 * ZZ_LEXSTATE[l+1] is the state in the DFA for the lexical state l
  	 *                  at the beginning of a line
  	 * l is of the form l = 2*k, k a non negative integer
  	 */
  	private static final int ZZ_LEXSTATE[] = { 
  		0,  0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6, 6
  	};
  
  	/** 
  	 * Translates characters to character classes
  	 */
  	private static final String ZZ_CMAP_PACKED = 
      "\11\0\1\1\1\2\1\66\1\66\1\3\22\0\1\1\1\44\1\41" +
      "\1\43\1\0\1\51\1\0\1\42\1\53\1\54\1\50\1\10\1\60" +
      "\1\16\1\14\1\52\1\11\11\6\1\62\1\61\1\46\1\15\1\45" +
      "\2\0\4\13\1\7\1\13\21\5\1\12\2\5\1\4\1\64\1\55" +
      "\1\63\1\5\1\0\1\17\1\22\1\34\1\21\1\24\1\32\1\5" +
      "\1\37\1\31\1\5\1\25\1\27\1\5\1\20\1\26\1\36\1\5" +
      "\1\23\1\30\1\35\1\33\1\65\1\40\1\12\2\5\1\56\1\0" +
      "\1\57\1\47\6\0\1\66\u1fa2\0\1\66\1\66\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\uffff\0\udfe6\0";
  
  	/** 
  	 * Translates characters to character classes
  	 */
  	private static final char [] ZZ_CMAP = zzUnpackCMap(ZZ_CMAP_PACKED);
  
  	/** 
  	 * Translates DFA states to action switch labels.
  	 */
  	private static final int [] ZZ_ACTION = zzUnpackAction();
  
  	private static final String ZZ_ACTION_PACKED_0 =
      "\7\0\1\1\1\2\2\3\1\4\1\5\1\6\1\7" +
      "\1\6\1\10\1\11\1\12\15\5\1\13\1\14\1\15" +
      "\1\16\1\17\1\1\1\20\1\21\1\22\1\23\1\24" +
      "\1\25\1\26\1\27\1\30\1\31\1\32\1\33\3\34" +
      "\1\35\2\36\1\37\2\40\3\41\1\42\2\43\1\44" +
      "\1\42\2\45\1\44\1\42\1\46\2\0\1\6\1\0" +
      "\1\6\1\47\1\50\1\51\3\5\1\52\4\5\1\53" +
      "\1\5\1\54\1\55\7\5\1\56\1\57\1\60\1\61" +
      "\1\0\1\62\1\0\1\63\1\0\2\6\1\64\1\0" +
      "\1\51\1\65\1\66\1\67\3\5\1\70\3\5\1\71" +
      "\5\5\1\72\1\0\2\73\3\5\1\74\4\5\1\75" +
      "\1\76\1\5\2\0\1\77\3\5\1\100\1\101\1\5" +
      "\1\102\1\103\1\0\1\104\1\105\1\106\1\5\1\0" +
      "\1\5\1\107";
  
  	private static int [] zzUnpackAction()
  	{
  		int [] result = new int[163];
  		int offset = 0;
  		offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result);
  		return result;
  	}
  
  	private static int zzUnpackAction(String packed, int offset, int [] result)
  	{
  		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++);
  			do result[j++] = value; while (--count > 0);
  		}
  		return j;
  	}
  
  
  	/** 
  	 * Translates a state to a row index in the transition table
  	 */
  	private static final int [] ZZ_ROWMAP = zzUnpackRowMap();
  
  	private static final String ZZ_ROWMAP_PACKED_0 =
      "\0\0\0\67\0\156\0\245\0\334\0\u0113\0\u014a\0\u0181" +
      "\0\u01b8\0\u0181\0\u01ef\0\u0226\0\u025d\0\u0294\0\u0181\0\u02cb" +
      "\0\u0302\0\u0339\0\u0370\0\u03a7\0\u03de\0\u0415\0\u044c\0\u0483" +
      "\0\u04ba\0\u04f1\0\u0528\0\u055f\0\u0596\0\u05cd\0\u0604\0\u063b" +
      "\0\u0181\0\u0181\0\u0672\0\u06a9\0\u06e0\0\u0717\0\u0181\0\u0181" +
      "\0\u0181\0\u0181\0\u0181\0\u0181\0\u0181\0\u0181\0\u0181\0\u0181" +
      "\0\u0181\0\u0181\0\u0181\0\u074e\0\u0785\0\u0181\0\u0181\0\u07bc" +
      "\0\u0181\0\u0181\0\u07f3\0\u0181\0\u082a\0\u0861\0\u0181\0\u0181" +
      "\0\u0898\0\u08cf\0\u0906\0\u0181\0\u093d\0\u0974\0\u09ab\0\u0181" +
      "\0\u0226\0\u09e2\0\u0a19\0\u0a50\0\u0a87\0\u0abe\0\u0181\0\u0af5" +
      "\0\u0b2c\0\u0b63\0\u0b9a\0\u025d\0\u0bd1\0\u0c08\0\u0c3f\0\u0c76" +
      "\0\u025d\0\u0cad\0\u025d\0\u025d\0\u0ce4\0\u0d1b\0\u0d52\0\u0d89" +
      "\0\u0dc0\0\u0df7\0\u0e2e\0\u0181\0\u0181\0\u0181\0\u0181\0\u0785" +
      "\0\u0181\0\u0861\0\u0181\0\u0a87\0\u0e65\0\u0a50\0\u0181\0\u0e9c" +
      "\0\u0ed3\0\u025d\0\u025d\0\u025d\0\u0f0a\0\u0f41\0\u0f78\0\u025d" +
      "\0\u0faf\0\u0fe6\0\u101d\0\u025d\0\u1054\0\u108b\0\u10c2\0\u10f9" +
      "\0\u1130\0\u0181\0\u1167\0\u119e\0\u11d5\0\u120c\0\u1243\0\u127a" +
      "\0\u12b1\0\u12e8\0\u131f\0\u1356\0\u138d\0\u025d\0\u025d\0\u13c4" +
      "\0\u119e\0\u13fb\0\u025d\0\u1432\0\u1469\0\u14a0\0\u025d\0\u025d" +
      "\0\u14d7\0\u025d\0\u025d\0\u150e\0\u025d\0\u025d\0\u025d\0\u1545" +
      "\0\u157c\0\u15b3\0\u025d";
  
  	private static int [] zzUnpackRowMap()
  	{
  		int [] result = new int[163];
  		int offset = 0;
  		offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result);
  		return result;
  	}
  
  	private static int zzUnpackRowMap(String packed, int offset, int [] result)
  	{
  		int i = 0;  /* index in packed string  */
  		int j = offset;  /* index in unpacked array */
  		int l = packed.length();
  		while (i < l)
  		{
  			int high = packed.charAt(i++) << 16;
  			result[j++] = high | packed.charAt(i++);
  		}
  		return j;
  	}
  
  	/** 
  	 * The transition table of the DFA
  	 */
  	private static final int [] ZZ_TRANS = zzUnpackTrans();
  
  	private static final String ZZ_TRANS_PACKED_0 =
      "\1\10\1\11\1\12\1\13\1\14\1\15\1\16\1\15"+
      "\1\17\1\20\2\15\1\21\1\22\1\23\1\24\1\25"+
      "\1\26\1\27\1\30\1\31\1\15\1\32\1\33\1\15"+
      "\1\34\1\35\1\36\1\15\1\37\2\15\1\40\1\41"+
      "\1\42\1\43\1\10\1\44\1\45\1\46\1\47\1\50"+
      "\1\51\1\52\1\53\1\54\1\55\1\56\1\57\1\60"+
      "\1\61\1\62\1\10\1\15\1\0\3\63\1\64\51\63"+
      "\1\65\10\63\1\0\2\66\1\67\1\70\62\66\1\0"+
      "\2\71\1\72\1\73\62\71\1\0\3\74\1\75\51\74"+
      "\1\76\10\74\1\0\2\77\1\100\1\101\35\77\1\102"+
      "\22\77\1\103\1\77\1\0\2\77\1\104\1\105\36\77"+
      "\1\106\21\77\1\107\1\77\71\0\1\11\67\0\1\12"+
      "\70\0\1\110\10\0\1\111\56\0\3\15\1\0\3\15"+
      "\3\0\22\15\24\0\1\15\7\0\1\16\1\112\1\0"+
      "\1\16\2\0\1\113\7\0\1\112\50\0\1\16\1\112"+
      "\1\0\1\16\1\114\1\0\1\113\7\0\1\112\50\0"+
      "\1\115\2\0\1\115\2\0\1\116\67\0\1\117\67\0"+
      "\1\120\55\0\3\15\1\0\3\15\3\0\1\15\1\121"+
      "\20\15\24\0\1\15\6\0\3\15\1\0\3\15\3\0"+
      "\7\15\1\122\2\15\1\123\7\15\24\0\1\15\6\0"+
      "\3\15\1\0\3\15\3\0\7\15\1\124\12\15\24\0"+
      "\1\15\6\0\3\15\1\0\3\15\3\0\4\15\1\125"+
      "\15\15\24\0\1\15\6\0\3\15\1\0\3\15\3\0"+
      "\5\15\1\126\14\15\24\0\1\15\6\0\3\15\1\0"+
      "\3\15\3\0\1\15\1\127\6\15\1\130\11\15\24\0"+
      "\1\15\6\0\3\15\1\0\3\15\3\0\4\15\1\131"+
      "\15\15\24\0\1\15\6\0\3\15\1\0\3\15\3\0"+
      "\7\15\1\132\12\15\24\0\1\15\6\0\3\15\1\0"+
      "\3\15\3\0\1\15\1\133\11\15\1\134\6\15\24\0"+
      "\1\15\6\0\3\15\1\0\3\15\3\0\1\135\6\15"+
      "\1\136\4\15\1\137\5\15\24\0\1\15\6\0\3\15"+
      "\1\0\3\15\3\0\1\15\1\140\20\15\24\0\1\15"+
      "\6\0\3\15\1\0\3\15\3\0\4\15\1\141\13\15"+
      "\1\142\1\15\24\0\1\15\6\0\3\15\1\0\3\15"+
      "\3\0\20\15\1\143\1\15\24\0\1\15\45\0\1\144"+
      "\37\0\1\145\66\0\1\146\66\0\1\147\53\0\1\63"+
      "\101\0\1\150\37\0\1\151\13\0\1\67\66\0\1\72"+
      "\66\0\1\74\101\0\1\152\37\0\1\153\13\0\1\100"+
      "\125\0\1\77\27\0\1\77\1\0\1\77\12\0\2\77"+
      "\1\0\2\77\6\0\1\77\2\0\1\77\3\0\2\77"+
      "\12\0\1\77\6\0\2\77\3\0\1\104\126\0\1\77"+
      "\26\0\1\77\1\0\1\77\12\0\2\77\1\0\2\77"+
      "\6\0\1\77\2\0\1\77\4\0\1\77\12\0\1\77"+
      "\6\0\2\77\7\0\1\115\1\0\1\154\1\115\4\0"+
      "\1\154\56\0\1\155\2\0\1\155\63\0\2\156\1\0"+
      "\1\156\1\0\1\156\3\0\1\156\1\0\2\156\1\0"+
      "\1\156\5\0\1\156\1\0\1\156\40\0\1\115\2\0"+
      "\1\115\71\0\1\157\56\0\1\160\11\0\1\161\55\0"+
      "\3\15\1\0\3\15\3\0\2\15\1\162\17\15\24\0"+
      "\1\15\6\0\3\15\1\0\3\15\3\0\16\15\1\163"+
      "\3\15\24\0\1\15\6\0\3\15\1\0\3\15\3\0"+
      "\10\15\1\164\11\15\24\0\1\15\6\0\3\15\1\0"+
      "\3\15\3\0\5\15\1\165\14\15\24\0\1\15\6\0"+
      "\3\15\1\0\3\15\3\0\16\15\1\166\1\167\2\15"+
      "\24\0\1\15\6\0\3\15\1\0\3\15\3\0\2\15"+
      "\1\170\17\15\24\0\1\15\6\0\3\15\1\0\3\15"+
      "\3\0\11\15\1\171\10\15\24\0\1\15\6\0\3\15"+
      "\1\0\3\15\3\0\15\15\1\172\4\15\24\0\1\15"+
      "\6\0\3\15\1\0\3\15\3\0\10\15\1\173\11\15"+
      "\24\0\1\15\6\0\3\15\1\0\3\15\3\0\4\15"+
      "\1\174\15\15\24\0\1\15\6\0\3\15\1\0\3\15"+
      "\3\0\1\15\1\175\20\15\24\0\1\15\6\0\3\15"+
      "\1\0\3\15\3\0\16\15\1\176\3\15\24\0\1\15"+
      "\6\0\3\15\1\0\3\15\3\0\14\15\1\177\5\15"+
      "\24\0\1\15\6\0\3\15\1\0\3\15\3\0\5\15"+
      "\1\200\14\15\24\0\1\15\6\0\3\15\1\0\3\15"+
      "\3\0\12\15\1\201\7\15\24\0\1\15\7\0\1\155"+
      "\1\112\1\0\1\155\12\0\1\112\46\0\1\202\10\0"+
      "\1\160\51\0\2\203\1\204\1\205\12\203\1\161\50\203"+
      "\5\0\3\15\1\0\3\15\3\0\1\206\21\15\24\0"+
      "\1\15\6\0\3\15\1\0\3\15\3\0\14\15\1\207"+
      "\5\15\24\0\1\15\6\0\3\15\1\0\3\15\3\0"+
      "\5\15\1\210\14\15\24\0\1\15\6\0\3\15\1\0"+
      "\3\15\3\0\5\15\1\211\14\15\24\0\1\15\6\0"+
      "\3\15\1\0\3\15\3\0\1\212\21\15\24\0\1\15"+
      "\6\0\3\15\1\0\3\15\3\0\11\15\1\213\10\15"+
      "\24\0\1\15\6\0\3\15\1\0\3\15\3\0\15\15"+
      "\1\214\4\15\24\0\1\15\6\0\3\15\1\0\3\15"+
      "\3\0\12\15\1\215\7\15\24\0\1\15\6\0\3\15"+
      "\1\0\3\15\3\0\5\15\1\216\14\15\24\0\1\15"+
      "\6\0\3\15\1\0\3\15\3\0\1\15\1\217\20\15"+
      "\24\0\1\15\6\0\3\15\1\0\3\15\3\0\10\15"+
      "\1\220\11\15\24\0\1\15\1\0\2\203\1\204\1\205"+
      "\63\203\1\0\1\221\14\0\1\222\51\0\1\221\1\204"+
      "\13\0\1\222\55\0\3\15\1\0\3\15\3\0\6\15"+
      "\1\223\13\15\24\0\1\15\6\0\3\15\1\0\3\15"+
      "\3\0\4\15\1\224\15\15\24\0\1\15\6\0\3\15"+
      "\1\0\3\15\3\0\1\225\21\15\24\0\1\15\6\0"+
      "\3\15\1\0\3\15\3\0\12\15\1\226\7\15\24\0"+
      "\1\15\6\0\3\15\1\0\3\15\3\0\10\15\1\227"+
      "\11\15\24\0\1\15\6\0\3\15\1\0\3\15\3\0"+
      "\5\15\1\230\14\15\24\0\1\15\6\0\3\15\1\0"+
      "\3\15\3\0\16\15\1\231\3\15\24\0\1\15\6\0"+
      "\3\15\1\0\3\15\3\0\10\15\1\232\11\15\24\0"+
      "\1\15\6\0\3\15\1\0\3\15\3\0\5\15\1\233"+
      "\14\15\24\0\1\15\17\0\1\234\55\0\3\15\1\0"+
      "\3\15\3\0\1\15\1\235\20\15\24\0\1\15\6\0"+
      "\3\15\1\0\3\15\3\0\16\15\1\236\3\15\24\0"+
      "\1\15\6\0\3\15\1\0\3\15\3\0\13\15\1\237"+
      "\6\15\24\0\1\15\6\0\3\15\1\0\3\15\3\0"+
      "\12\15\1\240\7\15\24\0\1\15\1\0\2\203\1\204"+
      "\1\205\1\241\62\203\5\0\3\15\1\0\3\15\3\0"+
      "\7\15\1\242\12\15\24\0\1\15\3\0\1\204\1\205"+
      "\70\0\3\15\1\0\3\15\3\0\1\15\1\243\20\15"+
      "\24\0\1\15\1\0";
  
  	private static int [] zzUnpackTrans()
  	{
  		int [] result = new int[5610];
  		int offset = 0;
  		offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result);
  		return result;
  	}
  
  	private static int zzUnpackTrans(String packed, int offset, int [] result)
  	{
  		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 result[j++] = value; while (--count > 0);
  		}
  		return j;
  	}
  
  
  	/* error codes */
  	private static final int ZZ_UNKNOWN_ERROR = 0;
  	private static final int ZZ_NO_MATCH = 1;
  	private static final int ZZ_PUSHBACK_2BIG = 2;
  
  	/* error messages for the codes above */
  	private static final String ZZ_ERROR_MSG[] = {
  		"Unknown internal scanner error",
  		"Error: could not match input",
  		"Error: pushback value was too large"
  	};
  
  	/**
  	 * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code>
  	 */
  	private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute();
  
  	private static final String ZZ_ATTRIBUTE_PACKED_0 =
      "\7\0\1\11\1\1\1\11\4\1\1\11\21\1\2\11" +
      "\4\1\15\11\2\1\2\11\1\1\2\11\1\1\1\11" +
      "\2\1\2\11\3\1\1\11\3\1\1\11\2\0\1\1" +
      "\1\0\2\1\1\11\24\1\4\11\1\0\1\11\1\0" +
      "\1\11\1\0\2\1\1\11\1\0\21\1\1\11\1\0" +
      "\15\1\2\0\11\1\1\0\4\1\1\0\2\1";
  
  	private static int [] zzUnpackAttribute()
  	{
  		int [] result = new int[163];
  		int offset = 0;
  		offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result);
  		return result;
  	}
  
  	private static int zzUnpackAttribute(String packed, int offset, int [] result)
  	{
  		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++);
  			do result[j++] = value; while (--count > 0);
  		}
  		return j;
  	}
  
  	/** the input device */
  	private java.io.Reader zzReader;
  
  	/** the current state of the DFA */
  	private int zzState;
  
  	/** the current lexical state */
  	private int zzLexicalState = YYINITIAL;
  
  	/** this buffer contains the current text to be matched and is
  	 the source of the yytext() string */
  	private char zzBuffer[] = new char[ZZ_BUFFERSIZE];
  
  	/** the textposition at the last accepting state */
  	private int zzMarkedPos;
  
  	/** the current text position in the buffer */
  	private int zzCurrentPos;
  
  	/** startRead marks the beginning of the yytext() string in the buffer */
  	private int zzStartRead;
  
  	/** endRead marks the last character in the buffer, that has been read
  	 from input */
  	private int zzEndRead;
  
  	/** 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
  	 */
  	private int yycolumn;
  
  	/** 
  	 * zzAtBOL == true <=> the scanner is currently at the beginning of a line
  	 */
  	private boolean zzAtBOL = true;
  
  	/** zzAtEOF == true <=> the scanner is at the EOF */
  	private boolean zzAtEOF;
  
  	/** denotes if the user-EOF-code has already been executed */
  	private boolean zzEOFDone;
  
  	/** 
  	 * The number of occupied positions in zzBuffer beyond zzEndRead.
  	 * When a lead/high surrogate has been read from the input stream
  	 * into the final zzBuffer position, this will have a value of 1;
  	 * otherwise, it will have a value of 0.
  	 */
  	private int zzFinalHighSurrogate = 0;
  
  	/* user code: */
  
  	static class ExtendedSyntaxStrCommentHandler
  	{
  		/* Code to handle extended quote/comment syntax
  		 *
  		 * There is a basic assumption that inside a longstring or longcomment
  		 * you cannot begin another longstring or comment, thus there is only
  		 * ever 1 closing bracket to track, and once found no more closing brackets are valid
  		 * until another opening bracket.
  		 * */
  		int longQLevel = 0;
  
  		boolean isCurrentExtQuoteStart(CharSequence endQuote)
  		{
  			int level = getLevel(endQuote);
  			return longQLevel == level;
  		}
  
  		void resetCurrentExtQuoteStart()
  		{
  			longQLevel = 0;
  		}
  
  		void setCurrentExtQuoteStart(CharSequence cs)
  		{
  			int level = getLevel(cs);
  
  			longQLevel = level;
  		}
  
  		private static int getLevel(CharSequence cs)
  		{
  			int level = 0;
  			int comment = 0;
  			while (cs.charAt(comment) == '-') comment++;
  			while (cs.length() > comment + level && cs.charAt(comment + 1 + level) == '=') level++;
  			return level;
  		}
  
  	}
  
  
      ExtendedSyntaxStrCommentHandler longCommentOrStringHandler = new ExtendedSyntaxStrCommentHandler();
  
  
  	/**
  	 * Creates a new scanner
  	 *
  	 * @param   in  the java.io.Reader to read input from.
  	 */
  	public LuaLexer(java.io.Reader in)
  	{
  		this.zzReader = in;
  	}
  
  	public LuaLexer(CharSequence in)
  	{
  		this.zzReader = new CharSeqReader(in);
  	}
  	/** 
  	 * Unpacks the compressed character translation table.
  	 *
  	 * @param packed   the packed character translation table
  	 * @return         the unpacked character translation table
  	 */
  	private static char [] zzUnpackCMap(String packed)
  	{
  		char [] map = new char[0x110000];
  		int i = 0;  /* index in packed string  */
  		int j = 0;  /* index in unpacked array */
  		while (i < 188)
  		{
  			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 zzRefill() throws java.io.IOException
  	{
  
  		/* first: make room (if you can) */
  		if (zzStartRead > 0)
  		{
  			zzEndRead += zzFinalHighSurrogate;
  			zzFinalHighSurrogate = 0;
  			System.arraycopy(zzBuffer, zzStartRead,
  							 zzBuffer, 0,
  							 zzEndRead - zzStartRead);
  
  			/* translate stored positions */
  			zzEndRead -= zzStartRead;
  			zzCurrentPos -= zzStartRead;
  			zzMarkedPos -= zzStartRead;
  			zzStartRead = 0;
  		}
  
  		/* is the buffer big enough? */
  		if (zzCurrentPos >= zzBuffer.length - zzFinalHighSurrogate)
  		{
  			/* if not: blow it up */
  			char newBuffer[] = new char[zzBuffer.length * 2];
  			System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length);
  			zzBuffer = newBuffer;
  			zzEndRead += zzFinalHighSurrogate;
  			zzFinalHighSurrogate = 0;
  		}
  
  		/* fill the buffer with new input */
  		int requested = zzBuffer.length - zzEndRead;
  		int numRead = zzReader.read(zzBuffer, zzEndRead, requested);
  
  		/* not supposed to occur according to specification of java.io.Reader */
  		if (numRead == 0)
  		{
  			throw new java.io.IOException("Reader returned 0 characters. See JFlex examples for workaround.");
  		}
  		if (numRead > 0)
  		{
  			zzEndRead += numRead;
  			/* If numRead == requested, we might have requested to few chars to
  			 encode a full Unicode character. We assume that a Reader would
  			 otherwise never return half characters. */
  			if (numRead == requested)
  			{
  				if (Character.isHighSurrogate(zzBuffer[zzEndRead - 1]))
  				{
  					--zzEndRead;
  					zzFinalHighSurrogate = 1;
  				}
  			}
  			/* potentially more input available */
  			return false;
  		}
  
  		/* numRead < 0 ==> end of stream */
  		return true;
  	}
  
  
  	/**
  	 * Closes the input stream.
  	 */
  	public final void yyclose() throws java.io.IOException
  	{
  		zzAtEOF = true;            /* indicate end of file */
  		zzEndRead = zzStartRead;  /* invalidate buffer    */
  
  		if (zzReader != null)
  			zzReader.close();
  	}
  
  
  	/**
  	 * Resets the scanner to read from a new input stream.
  	 * Does not close the old reader.
  	 *
  	 * 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>ZZ_INITIAL</tt>.
  	 *
  	 * Internal scan buffer is resized down to its initial length, if it has grown.
  	 *
  	 * @param reader   the new input stream 
  	 */
  	public final void yyreset(java.io.Reader reader)
  	{
  		zzReader = reader;
  		zzAtBOL  = true;
  		zzAtEOF  = false;
  		zzEOFDone = false;
  		zzEndRead = zzStartRead = 0;
  		zzCurrentPos = zzMarkedPos = 0;
  		zzFinalHighSurrogate = 0;
  		yyline = yychar = yycolumn = 0;
  		zzLexicalState = YYINITIAL;
  		if (zzBuffer.length > ZZ_BUFFERSIZE)
  			zzBuffer = new char[ZZ_BUFFERSIZE];
  	}
  
  
  	/**
  	 * Returns the current lexical state.
  	 */
  	public final int yystate()
  	{
  		return zzLexicalState;
  	}
  
  
  	/**
  	 * Enters a new lexical state
  	 *
  	 * @param newState the new lexical state
  	 */
  	public final void yybegin(int newState)
  	{
  		zzLexicalState = newState;
  	}
  
  
  	/**
  	 * Returns the text matched by the current regular expression.
  	 */
  	public final String yytext()
  	{
  		return new String(zzBuffer, zzStartRead, zzMarkedPos - zzStartRead);
  	}
  
  
  	/**
  	 * 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
  	 */
  	public final char yycharat(int pos)
  	{
  		return zzBuffer[zzStartRead + pos];
  	}
  
  
  	/**
  	 * Returns the length of the matched text region.
  	 */
  	public final int yylength()
  	{
  		return zzMarkedPos - zzStartRead;
  	}
  
  
  	/**
  	 * 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 zzScanError(int errorCode)
  	{
  		String message;
  		try
  		{
  			message = ZZ_ERROR_MSG[errorCode];
  		}
  		catch (ArrayIndexOutOfBoundsException e)
  		{
  			message = ZZ_ERROR_MSG[ZZ_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()!
  	 */
  	public void yypushback(int number)
  	{
  		if (number > yylength())
  			zzScanError(ZZ_PUSHBACK_2BIG);
  
  		zzMarkedPos -= number;
  	}
  
  
  	/**
  	 * Contains user EOF-code, which will be executed exactly once,
  	 * when the end of file is reached
  	 */
  	private void zzDoEOF()
  	{
  		if (!zzEOFDone)
  		{
  			zzEOFDone = true;
  
  
  		}
  	}
  
  
  	/**
  	 * 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 LuaTokenTypes advance() throws java.io.IOException
  	{
  		int zzInput;
  		int zzAction;
  
  		// cached fields:
  		int zzCurrentPosL;
  		int zzMarkedPosL;
  		int zzEndReadL = zzEndRead;
  		char [] zzBufferL = zzBuffer;
  		char [] zzCMapL = ZZ_CMAP;
  
  		int [] zzTransL = ZZ_TRANS;
  		int [] zzRowMapL = ZZ_ROWMAP;
  		int [] zzAttrL = ZZ_ATTRIBUTE;
  
  		while (true)
  		{
  			zzMarkedPosL = zzMarkedPos;
  
  			zzAction = -1;
  
  			zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL;
  
  			zzState = ZZ_LEXSTATE[zzLexicalState];
  
  			// set up zzAction for empty match case:
  			int zzAttributes = zzAttrL[zzState];
  			if ((zzAttributes & 1) == 1)
  			{
  				zzAction = zzState;
  			}
  
  
  			zzForAction:
  			{
  				while (true)
  				{
  
  					if (zzCurrentPosL < zzEndReadL)
  					{
  						zzInput = Character.codePointAt(zzBufferL, zzCurrentPosL, zzEndReadL);
  						zzCurrentPosL += Character.charCount(zzInput);
  					}
  					else if (zzAtEOF)
  					{
  						zzInput = YYEOF;
  						break zzForAction;
  					}
  					else
  					{
  						// store back cached positions
  						zzCurrentPos  = zzCurrentPosL;
  						zzMarkedPos   = zzMarkedPosL;
  						boolean eof = zzRefill();
  						// get translated positions and possibly new buffer
  						zzCurrentPosL  = zzCurrentPos;
  						zzMarkedPosL   = zzMarkedPos;
  						zzBufferL      = zzBuffer;
  						zzEndReadL     = zzEndRead;
  						if (eof)
  						{
  							zzInput = YYEOF;
  							break zzForAction;
  						}
  						else
  						{
  							zzInput = Character.codePointAt(zzBufferL, zzCurrentPosL, zzEndReadL);
  							zzCurrentPosL += Character.charCount(zzInput);
  						}
  					}
  					int zzNext = zzTransL[zzRowMapL[zzState] + zzCMapL[zzInput]];
  					if (zzNext == -1) break zzForAction;
  					zzState = zzNext;
  
  					zzAttributes = zzAttrL[zzState];
  					if ((zzAttributes & 1) == 1)
  					{
  						zzAction = zzState;
  						zzMarkedPosL = zzCurrentPosL;
  						if ((zzAttributes & 8) == 8) break zzForAction;
  					}
  
  				}
  			}
  
  			// store back cached position
  			zzMarkedPos = zzMarkedPosL;
  
  			if (zzInput == YYEOF && zzStartRead == zzCurrentPos)
  			{
  				zzAtEOF = true;
  				zzDoEOF();
  				return null;
  			}
  			else
  			{
  				switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction])
  				{
  					case 1: 
  						{ return LuaTokenTypes.WRONG;
  						}
  					case 72: break;
  					case 2: 
  						{ return LuaTokenTypes.WS;
  						}
  					case 73: break;
  					case 3: 
  						{ return LuaTokenTypes.NEWLINE;
  						}
  					case 74: break;
  					case 4: 
  						{ return LuaTokenTypes.LBRACK;
  						}
  					case 75: break;
  					case 5: 
  						{ return LuaTokenTypes.NAME;
  						}
  					case 76: break;
  					case 6: 
  						{ return LuaTokenTypes.NUMBER;
  						}
  					case 77: break;
  					case 7: 
  						{ return LuaTokenTypes.PLUS;
  						}
  					case 78: break;
  					case 8: 
  						{ return LuaTokenTypes.DOT;
  						}
  					case 79: break;
  					case 9: 
  						{ return LuaTokenTypes.ASSIGN;
  						}
  					case 80: break;
  					case 10: 
  						{ return LuaTokenTypes.MINUS;
  						}
  					case 81: break;
  					case 11: 
  						{ yybegin(XSTRINGQ);  return LuaTokenTypes.STRING;
  						}
  					case 82: break;
  					case 12: 
  						{ yybegin(XSTRINGA); return LuaTokenTypes.STRING;
  						}
  					case 83: break;
  					case 13: 
  						{ return LuaTokenTypes.GETN;
  						}
  					case 84: break;
  					case 14: 
  						{ return LuaTokenTypes.GT;
  						}
  					case 85: break;
  					case 15: 
  						{ return LuaTokenTypes.LT;
  						}
  					case 86: break;
  					case 16: 
  						{ return LuaTokenTypes.MULT;
  						}
  					case 87: break;
  					case 17: 
  						{ return LuaTokenTypes.MOD;
  						}
  					case 88: break;
  					case 18: 
  						{ return LuaTokenTypes.DIV;
  						}
  					case 89: break;
  					case 19: 
  						{ return LuaTokenTypes.LPAREN;
  						}
  					case 90: break;
  					case 20: 
  						{ return LuaTokenTypes.RPAREN;
  						}
  					case 91: break;
  					case 21: 
  						{ return LuaTokenTypes.RBRACK;
  						}
  					case 92: break;
  					case 22: 
  						{ return LuaTokenTypes.LCURLY;
  						}
  					case 93: break;
  					case 23: 
  						{ return LuaTokenTypes.RCURLY;
  						}
  					case 94: break;
  					case 24: 
  						{ return LuaTokenTypes.COMMA;
  						}
  					case 95: break;
  					case 25: 
  						{ return LuaTokenTypes.SEMI;
  						}
  					case 96: break;
  					case 26: 
  						{ return LuaTokenTypes.COLON;
  						}
  					case 97: break;
  					case 27: 
  						{ return LuaTokenTypes.EXP;
  						}
  					case 98: break;
  					case 28: 
  						{ return LuaTokenTypes.LONGSTRING;
  						}
  					case 99: break;
  					case 29: 
  						{ yypushback(yytext().length()); yybegin(XLONGSTRING); return advance();
  						}
  					case 100: break;
  					case 30: 
  						{ return LuaTokenTypes.NL_BEFORE_LONGSTRING;
  						}
  					case 101: break;
  					case 31: 
  						{ return LuaTokenTypes.SHORTCOMMENT;
  						}
  					case 102: break;
  					case 32: 
  						{ yybegin(YYINITIAL);  yypushback(yytext().length()); return advance();
  						}
  					case 103: break;
  					case 33: 
  						{ return LuaTokenTypes.LONGCOMMENT;
  						}
  					case 104: break;
  					case 34: 
  						{ return LuaTokenTypes.STRING;
  						}
  					case 105: break;
  					case 35: 
  						{ yybegin(YYINITIAL); return LuaTokenTypes.WRONG;
  						}
  					case 106: break;
  					case 36: 
  						{ yybegin(YYINITIAL); return LuaTokenTypes.STRING;
  						}
  					case 107: break;
  					case 37: 
  						{ yybegin(YYINITIAL);return LuaTokenTypes.WRONG;
  						}
  					case 108: break;
  					case 38: 
  						{ longCommentOrStringHandler.setCurrentExtQuoteStart(yytext().toString()); yybegin(XLONGSTRING_BEGIN); return LuaTokenTypes.LONGSTRING_BEGIN;
  						}
  					case 109: break;
  					case 39: 
  						{ return LuaTokenTypes.CONCAT;
  						}
  					case 110: break;
  					case 40: 
  						{ return LuaTokenTypes.EQ;
  						}
  					case 111: break;
  					case 41: 
  						{ yypushback(yytext().length()); yybegin(XSHORTCOMMENT); return advance();
  						}
  					case 112: break;
  					case 42: 
  						{ return LuaTokenTypes.DO;
  						}
  					case 113: break;
  					case 43: 
  						{ return LuaTokenTypes.OR;
  						}
  					case 114: break;
  					case 44: 
  						{ return LuaTokenTypes.IN;
  						}
  					case 115: break;
  					case 45: 
  						{ return LuaTokenTypes.IF;
  						}
  					case 116: break;
  					case 46: 
  						{ yybegin(XSHORTCOMMENT); return LuaTokenTypes.SHEBANG;
  						}
  					case 117: break;
  					case 47: 
  						{ return LuaTokenTypes.GE;
  						}
  					case 118: break;
  					case 48: 
  						{ return LuaTokenTypes.LE;
  						}
  					case 119: break;
  					case 49: 
  						{ return LuaTokenTypes.NE;
  						}
  					case 120: break;
  					case 50: 
  						{ if (longCommentOrStringHandler.isCurrentExtQuoteStart(yytext()))
  							{
  								yybegin(YYINITIAL); longCommentOrStringHandler.resetCurrentExtQuoteStart(); return LuaTokenTypes.LONGSTRING_END;
  							}
  							else
  							{ yypushback(yytext().length() - 1); }
  							return LuaTokenTypes.LONGSTRING;
  						}
  					case 121: break;
  					case 51: 
  						{ if (longCommentOrStringHandler.isCurrentExtQuoteStart(yytext()))
  							{
  								yybegin(YYINITIAL); longCommentOrStringHandler.resetCurrentExtQuoteStart(); return LuaTokenTypes.LONGCOMMENT_END;
  							}
  							else
  							{ yypushback(yytext().length() - 1); }
  							return LuaTokenTypes.LONGCOMMENT;
  						}
  					case 122: break;
  					case 52: 
  						{ return LuaTokenTypes.ELLIPSIS;
  						}
  					case 123: break;
  					case 53: 
  						{ return LuaTokenTypes.AND;
  						}
  					case 124: break;
  					case 54: 
  						{ return LuaTokenTypes.NOT;
  						}
  					case 125: break;
  					case 55: 
  						{ return LuaTokenTypes.NIL;
  						}
  					case 126: break;
  					case 56: 
  						{ return LuaTokenTypes.END;
  						}
  					case 127: break;
  					case 57: 
  						{ return LuaTokenTypes.FOR;
  						}
  					case 128: break;
  					case 58: 
  						{ longCommentOrStringHandler.setCurrentExtQuoteStart(yytext().toString()); yybegin(XLONGCOMMENT); return LuaTokenTypes.LONGCOMMENT_BEGIN;
  						}
  					case 129: break;
  					case 59: 
  						{ yypushback(1); /* TODO: Only pushback a newline */  return LuaTokenTypes.LUADOC_COMMENT;
  						}
  					case 130: break;
  					case 60: 
  						{ return LuaTokenTypes.ELSE;
  						}
  					case 131: break;
  					case 61: 
  						{ return LuaTokenTypes.TRUE;
  						}
  					case 132: break;
  					case 62: 
  						{ return LuaTokenTypes.THEN;
  						}
  					case 133: break;
  					case 63: 
  						{ return LuaTokenTypes.BREAK;
  						}
  					case 134: break;
  					case 64: 
  						{ return LuaTokenTypes.LOCAL;
  						}
  					case 135: break;
  					case 65: 
  						{ return LuaTokenTypes.FALSE;
  						}
  					case 136: break;
  					case 66: 
  						{ return LuaTokenTypes.UNTIL;
  						}
  					case 137: break;
  					case 67: 
  						{ return LuaTokenTypes.WHILE;
  						}
  					case 138: break;
  					case 68: 
  						{ return LuaTokenTypes.RETURN;
  						}
  					case 139: break;
  					case 69: 
  						{ return LuaTokenTypes.REPEAT;
  						}
  					case 140: break;
  					case 70: 
  						{ return LuaTokenTypes.ELSEIF;
  						}
  					case 141: break;
  					case 71: 
  						{ return LuaTokenTypes.FUNCTION;
  						}
  					case 142: break;
  					default:
  						zzScanError(ZZ_NO_MATCH);
  				}
  			}
  		}
  	}
  
  	static class CharSeqReader extends Reader
  	{
          int offset = 0;
          CharSequence src;
  
          CharSeqReader(CharSequence src)
  		{
              this.src = src;
          }
  
          @Override
          public void close() throws IOException
  		{
              src = null;
              offset = 0;
          }
  
          @Override
          public int read(char[] chars, int i, int i1) throws IOException
  		{
              int len = Math.min(src.length() - offset, i1);
              for (int n = 0; n < len; n++)
  			{
                  chars[i++] = src.charAt(offset++);
              }
              if (len <= 0)
                  return  -1;
              return len;
          }
      }
  
  }
  