/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
*
*   http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied.  See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.airavata.datacat.parsers.gridchem.gfinalcoord;/* The following code was generated by JFlex 1.4.3 on 9/10/14 9:08 AM */

import java_cup.runtime.*;


/**
 * This class is a scanner generated by 
 * <a href="http://www.jflex.de/">JFlex</a> 1.4.3
 * on 9/10/14 9:08 AM from the specification file
 * <tt>gfinalcoord.flex</tt>
 */
public class GFinalCoordLexer implements java_cup.runtime.Scanner {

  /** 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 INPUTF = 30;
  public static final int ITER2 = 4;
  public static final int INPUTE = 28;
  public static final int INPUTD = 26;
  public static final int INPUTC = 24;
  public static final int INPUTB = 22;
  public static final int INPUTA = 20;
  public static final int INTVALUE = 8;
  public static final int INPUT = 18;
  public static final int IGNOREALL = 16;
  public static final int ITER = 2;
  public static final int YYINITIAL = 0;
  public static final int FLOAT2 = 14;
  public static final int FLOAT1 = 12;
  public static final int FLOATVALUE = 10;
  public static final int ITER3 = 6;

  /**
   * 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,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 
     2,  2,  3,  3,  4,  4,  5,  5,  6,  6,  7,  7,  2,  2,  2, 2
  };

  /** 
   * Translates characters to character classes
   */
  private static final char [] ZZ_CMAP = {
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
    17,  0,  0,  0,  0,  0,  0,  0, 18,  6,  0,  3,  0, 27,  4,  0, 
     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  0,  0,  0,  0,  0,  0, 
     0, 13, 19,  7, 10, 15,  5, 21, 20, 11,  2,  2, 26,  2, 12,  8, 
     2,  2,  9, 16, 14, 28,  2,  2, 22, 23, 24,  0,  0,  0,  0, 25, 
     0,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2, 
     2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  3,  0,  0,  0, 
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 
     0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0
  };

  /** 
   * Translates DFA states to action switch labels.
   */
  private static final int [] ZZ_ACTION = zzUnpackAction();

  private static final String ZZ_ACTION_PACKED_0 =
    "\10\0\5\1\2\2\10\1\4\0\1\2\14\0\1\2"+
    "\1\3\1\4\1\5\1\6\4\0\1\2\4\0\1\2"+
    "\4\0\1\2\4\0\1\2\4\0\1\2\4\0\1\2"+
    "\4\0\1\2\4\0\1\2\4\0\1\2\14\0\1\7"+
    "\12\0\1\10\14\0\1\11\41\0\1\12";

  private static int [] zzUnpackAction() {
    int [] result = new int[161];
    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\35\0\72\0\127\0\164\0\221\0\256\0\313"+
    "\0\350\0\u0105\0\u0122\0\u013f\0\u015c\0\u0179\0\u0196\0\u01b3"+
    "\0\u01d0\0\u01ed\0\u020a\0\u0227\0\u0244\0\u0261\0\u027e\0\u029b"+
    "\0\u02b8\0\u02d5\0\u02f2\0\u030f\0\u01b3\0\u032c\0\u01ed\0\u0349"+
    "\0\u0227\0\u0366\0\u0261\0\u0383\0\u03a0\0\u03bd\0\u03da\0\u03f7"+
    "\0\u0414\0\u032c\0\u0349\0\u0366\0\u0383\0\u0431\0\u044e\0\u046b"+
    "\0\u0488\0\u04a5\0\u04c2\0\u04df\0\u04fc\0\u0519\0\u0536\0\u0553"+
    "\0\u0570\0\u058d\0\u05aa\0\u05c7\0\u05e4\0\u0601\0\u061e\0\u063b"+
    "\0\u0658\0\u0675\0\u0692\0\u06af\0\u06cc\0\u06e9\0\u0706\0\u0723"+
    "\0\u0740\0\u075d\0\u077a\0\u0797\0\u07b4\0\u07d1\0\u07ee\0\u080b"+
    "\0\u0828\0\u0845\0\u0862\0\u087f\0\u089c\0\u08b9\0\u08d6\0\u08f3"+
    "\0\u0910\0\u092d\0\u094a\0\u0967\0\u0984\0\u09a1\0\u09be\0\u09db"+
    "\0\u09f8\0\u0a15\0\u0a32\0\u0a4f\0\u0a6c\0\u0a89\0\350\0\u0aa6"+
    "\0\u0ac3\0\u0ae0\0\u0afd\0\u0b1a\0\u0b37\0\u0b54\0\u0b71\0\u0b8e"+
    "\0\u0bab\0\350\0\u0bc8\0\u0be5\0\u0c02\0\u0c1f\0\u0c3c\0\u0c59"+
    "\0\u0c76\0\u0c93\0\u0cb0\0\u0ccd\0\u0cea\0\u0d07\0\350\0\u0d24"+
    "\0\u0d41\0\u0d5e\0\u0d7b\0\u0d98\0\u0db5\0\u0dd2\0\u0def\0\u0e0c"+
    "\0\u0e29\0\u0e46\0\u0e63\0\u0e80\0\u0e9d\0\u0eba\0\u0ed7\0\u0ef4"+
    "\0\u0f11\0\u0f2e\0\u0f4b\0\u0f68\0\u0f85\0\u0fa2\0\u0fbf\0\u0fdc"+
    "\0\u0ff9\0\u1016\0\u1033\0\u1050\0\u106d\0\u108a\0\u10a7\0\u10c4"+
    "\0\350";

  private static int [] zzUnpackRowMap() {
    int [] result = new int[161];
    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 =
    "\7\11\1\12\34\11\1\13\6\11\1\14\14\11\1\15"+
    "\40\11\1\16\2\11\1\16\1\11\4\16\1\17\5\16"+
    "\2\11\10\16\1\11\1\16\1\11\1\20\1\11\1\21"+
    "\27\11\1\21\2\11\1\22\1\11\1\23\27\11\1\23"+
    "\2\11\1\24\1\11\1\25\27\11\1\25\2\11\1\26"+
    "\1\11\1\27\27\11\1\27\1\11\45\0\1\30\50\0"+
    "\1\31\34\0\1\32\43\0\1\33\2\0\2\16\2\0"+
    "\1\16\1\0\12\16\2\0\10\16\1\0\1\16\1\0"+
    "\2\16\2\0\1\16\1\0\5\16\1\34\4\16\2\0"+
    "\10\16\1\0\1\16\1\0\1\35\2\0\1\36\31\0"+
    "\1\35\34\0\1\37\2\0\1\40\31\0\1\37\34\0"+
    "\1\41\2\0\1\42\31\0\1\41\34\0\1\43\2\0"+
    "\1\44\31\0\1\43\43\0\1\45\41\0\1\46\36\0"+
    "\1\47\50\0\1\50\2\0\2\16\2\0\1\16\1\0"+
    "\7\16\1\51\2\16\2\0\10\16\1\0\1\16\1\0"+
    "\1\52\34\0\1\53\34\0\1\54\34\0\1\55\44\0"+
    "\1\56\34\0\1\57\54\0\1\60\36\0\1\61\2\0"+
    "\2\16\2\0\1\16\1\0\10\16\1\62\1\16\2\0"+
    "\10\16\1\0\1\16\12\0\1\63\47\0\1\64\26\0"+
    "\1\65\50\0\1\66\2\0\2\16\2\0\1\16\1\0"+
    "\2\16\1\67\7\16\2\0\10\16\1\0\1\16\13\0"+
    "\1\70\40\0\1\71\31\0\1\72\53\0\1\73\2\0"+
    "\2\16\2\0\1\16\1\0\5\16\1\74\4\16\2\0"+
    "\10\16\1\0\1\16\14\0\1\75\41\0\1\76\25\0"+
    "\1\77\55\0\1\100\2\0\2\16\2\0\1\16\1\0"+
    "\12\16\2\0\10\16\1\0\1\101\15\0\1\102\40\0"+
    "\1\103\44\0\1\104\36\0\1\105\2\0\2\16\2\0"+
    "\1\16\1\0\1\106\11\16\2\0\10\16\1\0\1\16"+
    "\16\0\1\107\37\0\1\110\23\0\1\111\57\0\1\112"+
    "\2\0\2\16\2\0\1\16\1\0\12\16\2\0\7\16"+
    "\1\113\1\0\1\16\17\0\1\114\36\0\1\115\20\0"+
    "\1\116\62\0\1\117\2\0\2\16\2\0\1\16\1\0"+
    "\10\16\1\120\1\16\2\0\10\16\1\0\1\16\20\0"+
    "\1\121\35\0\1\122\44\0\1\123\36\0\1\124\2\0"+
    "\2\16\2\0\1\16\1\0\6\16\1\125\3\16\2\0"+
    "\10\16\1\0\1\16\21\0\1\126\34\0\1\127\20\0"+
    "\1\130\62\0\1\131\2\0\2\16\2\0\1\16\1\0"+
    "\2\16\1\132\7\16\2\0\10\16\1\0\1\16\22\0"+
    "\1\133\33\0\1\134\26\0\1\135\54\0\1\136\2\0"+
    "\2\16\2\0\1\16\1\0\12\16\1\137\1\0\10\16"+
    "\1\0\1\16\23\0\1\140\32\0\1\141\45\0\1\142"+
    "\35\0\1\143\13\0\1\144\32\0\1\145\45\0\1\146"+
    "\32\0\1\147\50\0\1\150\14\0\1\151\45\0\1\152"+
    "\36\0\1\153\41\0\1\154\21\0\1\155\25\0\1\156"+
    "\44\0\1\157\46\0\1\160\17\0\1\161\24\0\1\162"+
    "\47\0\1\163\46\0\1\164\16\0\1\165\40\0\1\166"+
    "\46\0\1\167\15\0\1\170\41\0\1\171\46\0\1\172"+
    "\10\0\1\173\46\0\1\174\46\0\1\147\20\0\1\175"+
    "\36\0\1\176\33\0\1\177\35\0\1\200\34\0\1\201"+
    "\34\0\1\202\34\0\1\203\34\0\1\204\34\0\1\205"+
    "\34\0\1\206\34\0\1\207\34\0\1\210\34\0\1\211"+
    "\34\0\1\212\34\0\1\213\34\0\1\214\42\0\1\215"+
    "\26\0\1\216\34\0\1\217\34\0\1\220\34\0\1\221"+
    "\34\0\1\222\34\0\1\223\34\0\1\224\34\0\1\225"+
    "\34\0\1\226\34\0\1\227\34\0\1\230\34\0\1\231"+
    "\34\0\1\232\34\0\1\233\34\0\1\234\34\0\1\235"+
    "\34\0\1\236\34\0\1\237\34\0\1\240\43\0\1\241"+
    "\4\0";

  private static int [] zzUnpackTrans() {
    int [] result = new int[4321];
    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[] = {
    "Unkown 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 =
    "\10\0\1\11\16\1\4\0\1\1\14\0\5\1\4\0"+
    "\1\1\4\0\1\1\4\0\1\1\4\0\1\1\4\0"+
    "\1\1\4\0\1\1\4\0\1\1\4\0\1\1\4\0"+
    "\1\1\14\0\1\11\12\0\1\11\14\0\1\11\41\0"+
    "\1\11";

  private static int [] zzUnpackAttribute() {
    int [] result = new int[161];
    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;

  /* user code: */
  public static boolean DEBUG = false;


  /**
   * 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 GFinalCoordLexer(java.io.Reader in) {
    this.zzReader = 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 GFinalCoordLexer(java.io.InputStream in) {
    this(new java.io.InputStreamReader(in));
  }


  /**
   * 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) {
      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) {
      /* if not: blow it up */
      char newBuffer[] = new char[zzCurrentPos*2];
      System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length);
      zzBuffer = newBuffer;
    }

    /* finally: fill the buffer with new input */
    int numRead = zzReader.read(zzBuffer, zzEndRead,
                                            zzBuffer.length-zzEndRead);

    if (numRead > 0) {
      zzEndRead+= numRead;
      return false;
    }
    // unlikely but not impossible: read 0 characters, but not at end of stream    
    if (numRead == 0) {
      int c = zzReader.read();
      if (c == -1) {
        return true;
      } else {
        zzBuffer[zzEndRead++] = (char) c;
        return false;
      }     
    }

	// numRead < 0
    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>.
   *
   * @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;
    yyline = yychar = yycolumn = 0;
    zzLexicalState = YYINITIAL;
  }


  /**
   * 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() throws java.io.IOException {
    if (!zzEOFDone) {
      zzEOFDone = true;
      yyclose();
    }
  }


  /**
   * 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 java_cup.runtime.Symbol next_token() 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];


      zzForAction: {
        while (true) {
    
          if (zzCurrentPosL < zzEndReadL)
            zzInput = zzBufferL[zzCurrentPosL++];
          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 = zzBufferL[zzCurrentPosL++];
            }
          }
          int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ];
          if (zzNext == -1) break zzForAction;
          zzState = zzNext;

          int zzAttributes = zzAttrL[zzState];
          if ( (zzAttributes & 1) == 1 ) {
            zzAction = zzState;
            zzMarkedPosL = zzCurrentPosL;
            if ( (zzAttributes & 8) == 8 ) break zzForAction;
          }

        }
      }

      // store back cached position
      zzMarkedPos = zzMarkedPosL;

      switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) {
        case 2: 
          { yybegin (INPUTA);
   return new Symbol(GFinalCoordSym.INPUT2);
          }
        case 11: break;
        case 5: 
          { yybegin (INPUTD);
   return new Symbol(GFinalCoordSym.INPUT5, new Float(yytext()));
          }
        case 12: break;
        case 6: 
          { yybegin (INPUT);
   return new Symbol(GFinalCoordSym.INPUT6, new Float(yytext()));
          }
        case 13: break;
        case 9: 
          { yybegin (IGNOREALL);
   return new Symbol(GFinalCoordSym.SCFDONE);
          }
        case 14: break;
        case 8: 
          { yybegin(ITER);
	   return new Symbol(GFinalCoordSym.FOUNDITER);
          }
        case 15: break;
        case 10: 
          { yybegin(INPUT);
            return new Symbol(GFinalCoordSym.INPUT1);
          }
        case 16: break;
        case 7: 
          { yybegin(IGNOREALL);
      return new Symbol(GFinalCoordSym.SCFDONE);
          }
        case 17: break;
        case 4: 
          { yybegin (INPUTC);
   return new Symbol(GFinalCoordSym.INPUT4, new Float(yytext()));
          }
        case 18: break;
        case 3: 
          { yybegin (INPUTB);
   return new Symbol(GFinalCoordSym.INPUT3, new Float(yytext()));
          }
        case 19: break;
        case 1: 
          { 
          }
        case 20: break;
        default: 
          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
            zzAtEOF = true;
            zzDoEOF();
              { return new java_cup.runtime.Symbol(GFinalCoordSym.EOF); }
          } 
          else {
            zzScanError(ZZ_NO_MATCH);
          }
      }
    }
  }

  /**
   * Converts an int token code into the name of the
   * token by reflection on the cup symbol class/interface sym
   *
   * This code was contributed by Karl Meissner <meissnersd@yahoo.com>
   */
  private String getTokenName(int token) {
    try {
      java.lang.reflect.Field [] classFields = GFinalCoordSym.class.getFields();
      for (int i = 0; i < classFields.length; i++) {
        if (classFields[i].getInt(null) == token) {
          return classFields[i].getName();
        }
      }
    } catch (Exception e) {
      e.printStackTrace(System.err);
    }

    return "UNKNOWN TOKEN";
  }

  /**
   * Same as next_token but also prints the token to standard out
   * for debugging.
   *
   * This code was contributed by Karl Meissner <meissnersd@yahoo.com>
   */
  public java_cup.runtime.Symbol debug_next_token() throws java.io.IOException {
    java_cup.runtime.Symbol s = next_token();
    System.out.println( " --"+ yytext() + "--" + getTokenName(s.sym) + "--");
    return s;
  }

  /**
   * Runs the scanner on input files.
   *
   * This is a standalone scanner, it will print any unmatched
   * text to System.out unchanged.
   *
   * @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 GFinalCoordLexer <inputfile>");
    }
    else {
      for (int i = 0; i < argv.length; i++) {
        GFinalCoordLexer scanner = null;
        try {
          scanner = new GFinalCoordLexer( new java.io.FileReader(argv[i]) );
          while ( !scanner.zzAtEOF ) scanner.next_token();
        }
        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();
        }
      }
    }
  }


}
