/*
*
* 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.gmcscfa;/* The following code was generated by JFlex 1.4.3 on 9/10/14 9:36 AM */

import java_cup.runtime.Symbol;
import org.apache.airavata.datacat.parsers.gridchem.Settings;


/**
 * This class is a scanner generated by 
 * <a href="http://www.jflex.de/">JFlex</a> 1.4.3
 * on 9/10/14 9:36 AM from the specification file
 * <tt>gmcscfa.flex</tt>
 */
public class GMCSCFaLexer 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 ITER2 = 6;
  public static final int DASH = 10;
  public static final int INTVALUE = 12;
  public static final int SCF1 = 2;
  public static final int IGNOREALL = 24;
  public static final int ITER = 4;
  public static final int YYINITIAL = 0;
  public static final int ITER8 = 8;
  public static final int ITER7 = 22;
  public static final int ITER6 = 20;
  public static final int ITER5 = 18;
  public static final int FLOATVALUE = 14;
  public static final int ITER4 = 16;

  /**
   * 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,  1,  1,  6,  6, 
     7,  7,  8,  8,  9,  9, 10, 10,  1, 1
  };

  /** 
   * 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, 
    11,  0,  0,  0,  0,  0,  0,  0, 19,  6,  0,  3,  0, 25,  4,  0, 
     1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  0,  0,  0,  0,  0,  0, 
     0, 13,  0, 23, 18,  9,  5, 16,  0,  7,  0,  0, 14, 21, 15, 12, 
    24, 22, 10, 20,  8,  0, 26,  0,  0, 17,  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,  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 =
    "\13\0\2\1\2\2\1\1\2\3\3\1\3\4\10\1"+
    "\5\0\1\5\13\0\1\6\2\0\1\7\1\10\1\11"+
    "\1\12\65\0\1\13\1\0\1\14\5\0\1\15\61\0"+
    "\1\16";

  private static int [] zzUnpackAction() {
    int [] result = new int[168];
    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\33\0\66\0\121\0\154\0\207\0\242\0\275"+
    "\0\330\0\363\0\u010e\0\u0129\0\u0144\0\u0129\0\u015f\0\u017a"+
    "\0\u0129\0\u0195\0\u01b0\0\u01cb\0\u01e6\0\u0129\0\u0201\0\u021c"+
    "\0\u0237\0\u0252\0\u026d\0\u0288\0\u02a3\0\u02be\0\u02d9\0\u02f4"+
    "\0\u030f\0\u032a\0\u01b0\0\u0345\0\u0360\0\u0201\0\u037b\0\u0237"+
    "\0\u0396\0\u026d\0\u03b1\0\u02a3\0\u03cc\0\u02d9\0\u03e7\0\u0402"+
    "\0\u041d\0\u0345\0\u0438\0\u0453\0\u0396\0\u03b1\0\u03cc\0\u03e7"+
    "\0\u046e\0\u0489\0\u04a4\0\u04bf\0\u04da\0\u04f5\0\u0510\0\u052b"+
    "\0\u0546\0\u0561\0\u057c\0\u0597\0\u05b2\0\u05cd\0\u05e8\0\u0603"+
    "\0\u061e\0\u0639\0\u0654\0\u066f\0\u068a\0\u06a5\0\u06c0\0\u06db"+
    "\0\u06f6\0\u0711\0\u072c\0\u0747\0\u0762\0\u077d\0\u0798\0\u07b3"+
    "\0\u07ce\0\u07e9\0\u0804\0\u081f\0\u083a\0\u0855\0\u0870\0\u088b"+
    "\0\u08a6\0\u08c1\0\u08dc\0\u08f7\0\u0912\0\u092d\0\u0948\0\u0963"+
    "\0\u097e\0\u0999\0\u09b4\0\u09cf\0\u09ea\0\u0129\0\u0a05\0\u0129"+
    "\0\u0a20\0\u0a3b\0\u0a56\0\u0a71\0\u0a8c\0\u0129\0\u0aa7\0\u0ac2"+
    "\0\u0add\0\u0af8\0\u0b13\0\u0b2e\0\u0b49\0\u0b64\0\u0b7f\0\u0b9a"+
    "\0\u0bb5\0\u0bd0\0\u0beb\0\u0c06\0\u0c21\0\u0c3c\0\u0c57\0\u0c72"+
    "\0\u0c8d\0\u0ca8\0\u0cc3\0\u0cde\0\u0cf9\0\u0d14\0\u0d2f\0\u0d4a"+
    "\0\u0d65\0\u0d80\0\u0d9b\0\u0db6\0\u0dd1\0\u0dec\0\u0e07\0\u0e22"+
    "\0\u0e3d\0\u0e58\0\u0e73\0\u0e8e\0\u0ea9\0\u0ec4\0\u0edf\0\u0efa"+
    "\0\u0f15\0\u0f30\0\u0f4b\0\u0f66\0\u0f81\0\u0f9c\0\u0fb7\0\u0129";

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

  private static int [] zzUnpackTrans() {
    int [] result = new int[4050];
    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 =
    "\13\0\1\11\1\1\1\11\2\1\1\11\4\1\1\11"+
    "\12\1\5\0\1\1\13\0\1\1\2\0\4\1\65\0"+
    "\1\11\1\0\1\11\5\0\1\11\61\0\1\11";

  private static int [] zzUnpackAttribute() {
    int [] result = new int[168];
    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 GMCSCFaLexer(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 GMCSCFaLexer(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 4: 
          { if  (Settings.DEBUG) System.out.println("GMCSCFaFlex: Found new line");
          }
        case 15: break;
        case 7: 
          { if (Settings.DEBUG) System.out.println("GMCSCFaFlex: Found the energy");
   if (Settings.DEBUG) System.out.println(yytext());
   yybegin(ITER5);
   return new Symbol(GMCSCFaSym.ENERGY, new Float(yytext()));
          }
        case 16: break;
        case 10: 
          { if  (Settings.DEBUG) System.out.println("GMCSCFaFlex: Found float3");
     yybegin(ITER2);
      return new Symbol(GMCSCFaSym.FLOAT3);
          }
        case 17: break;
        case 9: 
          { if  (Settings.DEBUG) System.out.println("GMCSCFaFlex: Found float2");
  yybegin (ITER7);
   return new Symbol(GMCSCFaSym.FLOAT2);
          }
        case 18: break;
        case 12: 
          { yybegin(DASH);
          }
        case 19: break;
        case 8: 
          { if (Settings.DEBUG) System.out.println("GMCSCFaFlex: ITER5");
   if (Settings.DEBUG) System.out.println("GMCSCFaFlex: Found float1");
   yybegin (ITER6);
    return new Symbol(GMCSCFaSym.FLOAT1);
          }
        case 20: break;
        case 5: 
          { if  (Settings.DEBUG) System.out.println("GMCSCFaFlex: Found float value");
  yybegin(ITER);
          }
        case 21: break;
        case 13: 
          { yybegin(IGNOREALL);
  return new Symbol(GMCSCFaSym.SCFDONE);
          }
        case 22: break;
        case 11: 
          { if (Settings.DEBUG) System.out.println("GMCSCFaFlex: Found the dash");
               yybegin(DASH);
          }
        case 23: break;
        case 6: 
          { if  (Settings.DEBUG) System.out.println("GMCSCFaFlex: Found float4");
     yybegin(ITER);
      return new Symbol(GMCSCFaSym.FLOAT4);
          }
        case 24: break;
        case 2: 
          { if (Settings.DEBUG) System.out.println("GMCSCFaFlex: Found the first integer in the iteration");
   if (Settings.DEBUG) System.out.println(yytext());
   yybegin(ITER4);
   return new Symbol(GMCSCFaSym.INTCycle, new Integer(yytext()));
          }
        case 25: break;
        case 14: 
          { if (Settings.DEBUG) System.out.println("GMCSCFaFlex: Found START OF");
	   yybegin(ITER);
	   return new Symbol(GMCSCFaSym.FOUNDITER);
          }
        case 26: break;
        case 1: 
          { 
          }
        case 27: break;
        case 3: 
          { if (Settings.DEBUG) System.out.println("GMCSCFaFlex: Found the second integer in the iteration");
     if (Settings.DEBUG) System.out.println(yytext());
     yybegin(ITER8); 
      return new Symbol(GMCSCFaSym.INT1, new Integer(yytext()));
          }
        case 28: break;
        default: 
          if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
            zzAtEOF = true;
            zzDoEOF();
              { return new java_cup.runtime.Symbol(GMCSCFaSym.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 = GMCSCFaSym.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 GMCSCFaLexer <inputfile>");
    }
    else {
      for (int i = 0; i < argv.length; i++) {
        GMCSCFaLexer scanner = null;
        try {
          scanner = new GMCSCFaLexer( 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();
        }
      }
    }
  }


}
