/*
*
* 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.mopta;/* The following code was generated by JFlex 1.4.3 on 9/12/14 12:11 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/12/14 12:11 AM from the specification file
 * <tt>mopta.flex</tt>
 */
public class MOptaLexer implements java_cup.runtime.Scanner {

    /**
     * This character denotes the end of file
     */
    public static final int YYEOF = -1;
    /**
     * 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 = 30;
    public static final int ITER = 4;
    public static final int YYINITIAL = 0;
    /**
     * the current lexical state
     */
    private int zzLexicalState = YYINITIAL;
    public static final int ITER9 = 22;
    public static final int ITER12 = 28;
    public static final int ITER8 = 8;
    public static final int ITER11 = 26;
    public static final int ITER7 = 20;
    public static final int ITER10 = 24;
    public static final int ITER6 = 18;
    public static final int ITER5 = 16;
    public static final int ITER4 = 14;
    /**
     * initial size of the lookahead buffer
     */
    private static final int ZZ_BUFFERSIZE = 16384;
    /**
     * this buffer contains the current text to be matched and is
     * the source of the yytext() string
     */
    private char zzBuffer[] = new char[ZZ_BUFFERSIZE];
    /**
     * 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, 1, 1, 3, 3, 4, 4, 1, 1, 5, 5,
            6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 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, 15, 6, 1, 4, 0, 4, 5, 0,
            2, 38, 3, 3, 3, 3, 3, 41, 3, 3, 0, 0, 0, 0, 0, 0,
            0, 20, 0, 0, 18, 9, 0, 13, 0, 7, 0, 0, 17, 21, 12, 16,
            24, 0, 10, 23, 8, 0, 0, 19, 22, 14, 0, 0, 0, 0, 0, 0,
            0, 0, 34, 36, 40, 25, 39, 0, 0, 32, 0, 37, 35, 27, 33, 26,
            0, 0, 29, 0, 28, 0, 0, 31, 0, 30, 0, 0, 4, 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 =
            "\15\0\2\1\2\2\24\1\4\0\1\3\3\0\1\4" +
                    "\2\0\1\5\2\0\1\6\2\0\1\7\2\0\1\10" +
                    "\2\0\1\11\2\0\1\12\2\0\1\13\70\0\1\14" +
                    "\51\0\1\15\114\0\1\16";
    /**
     * 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\52\0\124\0\176\0\250\0\322\0\374\0\u0126" +
                    "\0\u0150\0\u017a\0\u01a4\0\u01ce\0\u01f8\0\u0222\0\u024c\0\u0222" +
                    "\0\u0276\0\u02a0\0\u02ca\0\u02f4\0\u031e\0\u0348\0\u0372\0\u039c" +
                    "\0\u03c6\0\u03f0\0\u041a\0\u0444\0\u046e\0\u0498\0\u04c2\0\u04ec" +
                    "\0\u0516\0\u0540\0\u056a\0\u0594\0\u05be\0\u05e8\0\u0612\0\u02ca" +
                    "\0\u02f4\0\u02f4\0\u063c\0\u0348\0\u0372\0\u0372\0\u039c\0\u03c6" +
                    "\0\u03c6\0\u03f0\0\u041a\0\u041a\0\u0444\0\u046e\0\u046e\0\u0498" +
                    "\0\u04c2\0\u04c2\0\u04ec\0\u0516\0\u0516\0\u0540\0\u056a\0\u056a" +
                    "\0\u0594\0\u05be\0\u05be\0\u0666\0\u0690\0\u06ba\0\u06e4\0\u070e" +
                    "\0\u0738\0\u0762\0\u078c\0\u07b6\0\u07e0\0\u080a\0\u0834\0\u085e" +
                    "\0\u0888\0\u08b2\0\u08dc\0\u0906\0\u0930\0\u095a\0\u0984\0\u09ae" +
                    "\0\u09d8\0\u0a02\0\u0a2c\0\u0a56\0\u0a80\0\u0aaa\0\u0ad4\0\u0afe" +
                    "\0\u0b28\0\u0b52\0\u0b7c\0\u0ba6\0\u0bd0\0\u0bfa\0\u0c24\0\u0c4e" +
                    "\0\u0c78\0\u0ca2\0\u0ccc\0\u0cf6\0\u0d20\0\u0d4a\0\u0d74\0\u0d9e" +
                    "\0\u0dc8\0\u0df2\0\u0e1c\0\u0e46\0\u0e70\0\u0e9a\0\u0ec4\0\u0eee" +
                    "\0\u0f18\0\u0f42\0\u0f6c\0\u0222\0\u0f96\0\u0fc0\0\u0fea\0\u1014" +
                    "\0\u103e\0\u1068\0\u1092\0\u10bc\0\u10e6\0\u1110\0\u113a\0\u1164" +
                    "\0\u118e\0\u11b8\0\u11e2\0\u120c\0\u1236\0\u1260\0\u128a\0\u12b4" +
                    "\0\u12de\0\u1308\0\u1332\0\u135c\0\u1386\0\u13b0\0\u13da\0\u1404" +
                    "\0\u142e\0\u1458\0\u1482\0\u14ac\0\u14d6\0\u1500\0\u152a\0\u1554" +
                    "\0\u157e\0\u15a8\0\u15d2\0\u15fc\0\u1626\0\u0222\0\u1650\0\u167a" +
                    "\0\u16a4\0\u16ce\0\u16f8\0\u1722\0\u174c\0\u1776\0\u17a0\0\u17ca" +
                    "\0\u17f4\0\u181e\0\u1848\0\u1872\0\u189c\0\u18c6\0\u18f0\0\u191a" +
                    "\0\u1944\0\u196e\0\u1998\0\u19c2\0\u19ec\0\u1a16\0\u1a40\0\u1a6a" +
                    "\0\u1a94\0\u1abe\0\u1ae8\0\u1b12\0\u1b3c\0\u1b66\0\u1b90\0\u1bba" +
                    "\0\u1be4\0\u1c0e\0\u1c38\0\u1c62\0\u1c8c\0\u1cb6\0\u1ce0\0\u1d0a" +
                    "\0\u1d34\0\u1d5e\0\u1d88\0\u1db2\0\u1ddc\0\u1e06\0\u1e30\0\u1e5a" +
                    "\0\u1e84\0\u1eae\0\u1ed8\0\u1f02\0\u1f2c\0\u1f56\0\u1f80\0\u1faa" +
                    "\0\u1fd4\0\u1ffe\0\u2028\0\u2052\0\u207c\0\u20a6\0\u20d0\0\u20fa" +
                    "\0\u2124\0\u214e\0\u2178\0\u21a2\0\u21cc\0\u21f6\0\u2220\0\u224a" +
                    "\0\u2274\0\u229e\0\u0222";
    /**
     * The transition table of the DFA
     */
    private static final int[] ZZ_TRANS = zzUnpackTrans();
    private static final String ZZ_TRANS_PACKED_0 =
            "\7\16\1\17\116\16\1\20\1\21\11\16\1\22\30\16" +
                    "\1\21\2\16\1\21\2\16\3\23\1\24\40\16\1\23" +
                    "\2\16\1\23\1\16\1\25\52\16\3\26\1\27\40\16" +
                    "\1\26\2\16\1\26\2\16\3\30\1\31\40\16\1\30" +
                    "\2\16\1\30\2\16\3\32\1\33\40\16\1\32\2\16" +
                    "\1\32\2\16\3\34\1\35\40\16\1\34\2\16\1\34" +
                    "\2\16\3\36\1\37\40\16\1\36\2\16\1\36\2\16" +
                    "\3\40\1\41\40\16\1\40\2\16\1\40\2\16\3\42" +
                    "\1\43\40\16\1\42\2\16\1\42\2\16\3\44\1\45" +
                    "\40\16\1\44\2\16\1\44\62\0\1\46\43\0\2\21" +
                    "\42\0\1\21\2\0\1\21\31\0\1\47\22\0\2\50" +
                    "\1\0\1\51\40\0\1\50\2\0\1\50\2\0\2\52" +
                    "\42\0\1\52\2\0\1\52\1\0\1\53\52\0\2\54" +
                    "\1\0\1\55\40\0\1\54\2\0\1\54\2\0\2\56" +
                    "\42\0\1\56\2\0\1\56\2\0\2\57\1\0\1\60" +
                    "\40\0\1\57\2\0\1\57\2\0\2\61\42\0\1\61" +
                    "\2\0\1\61\2\0\2\62\1\0\1\63\40\0\1\62" +
                    "\2\0\1\62\2\0\2\64\42\0\1\64\2\0\1\64" +
                    "\2\0\2\65\1\0\1\66\40\0\1\65\2\0\1\65" +
                    "\2\0\2\67\42\0\1\67\2\0\1\67\2\0\2\70" +
                    "\1\0\1\71\40\0\1\70\2\0\1\70\2\0\2\72" +
                    "\42\0\1\72\2\0\1\72\2\0\2\73\1\0\1\74" +
                    "\40\0\1\73\2\0\1\73\2\0\2\75\42\0\1\75" +
                    "\2\0\1\75\2\0\2\76\1\0\1\77\40\0\1\76" +
                    "\2\0\1\76\2\0\2\100\42\0\1\100\2\0\1\100" +
                    "\2\0\2\101\1\0\1\102\40\0\1\101\2\0\1\101" +
                    "\2\0\2\103\42\0\1\103\2\0\1\103\11\0\1\104" +
                    "\72\0\1\105\20\0\1\106\62\0\1\107\72\0\1\110" +
                    "\17\0\1\111\55\0\1\112\75\0\1\113\21\0\1\114" +
                    "\63\0\1\115\72\0\1\116\16\0\1\117\63\0\1\120" +
                    "\73\0\1\121\15\0\1\122\63\0\1\123\74\0\1\124" +
                    "\14\0\1\125\61\0\1\126\53\0\1\127\37\0\1\130" +
                    "\64\0\1\131\74\0\1\132\13\0\1\133\61\0\1\134" +
                    "\75\0\1\135\15\0\1\136\62\0\1\137\77\0\1\140" +
                    "\12\0\1\141\65\0\1\142\70\0\1\143\16\0\1\144" +
                    "\66\0\1\145\67\0\1\146\16\0\1\147\67\0\1\150" +
                    "\63\0\1\151\21\0\1\152\70\0\1\153\72\0\1\154" +
                    "\11\0\1\155\71\0\1\156\43\0\1\157\37\0\1\160" +
                    "\72\0\1\161\63\0\1\162\16\0\1\163\56\0\1\164" +
                    "\75\0\1\165\20\0\1\166\63\0\1\167\51\0\1\170" +
                    "\37\0\1\171\63\0\1\172\100\0\1\173\10\0\1\174" +
                    "\63\0\1\175\101\0\1\176\21\0\1\177\70\0\1\200" +
                    "\30\0\1\201\104\0\1\202\21\0\1\203\102\0\1\204" +
                    "\15\0\1\205\53\0\1\206\50\0\1\207\52\0\1\210" +
                    "\53\0\1\211\102\0\1\212\21\0\1\213\46\0\1\214" +
                    "\55\0\1\215\64\0\1\216\33\0\1\217\104\0\1\220" +
                    "\13\0\1\221\53\0\1\222\61\0\1\223\63\0\1\224" +
                    "\22\0\1\225\74\0\1\226\33\0\1\227\102\0\1\230" +
                    "\20\0\1\231\70\0\1\232\32\0\1\233\73\0\1\234" +
                    "\27\0\1\235\106\0\1\236\14\0\1\237\51\0\1\240" +
                    "\51\0\1\241\107\0\1\242\22\0\1\243\31\0\1\244" +
                    "\60\0\1\245\42\0\1\246\62\0\1\247\51\0\1\250" +
                    "\51\0\1\251\51\0\1\252\51\0\1\253\51\0\1\254" +
                    "\51\0\1\255\51\0\1\256\51\0\1\257\51\0\1\260" +
                    "\53\0\1\261\46\0\1\262\63\0\1\263\47\0\1\264" +
                    "\54\0\1\265\50\0\1\266\53\0\1\267\36\0\1\270" +
                    "\51\0\1\271\51\0\1\272\51\0\1\273\51\0\1\274" +
                    "\53\0\1\275\46\0\1\276\63\0\1\277\47\0\1\300" +
                    "\43\0\1\301\55\0\1\302\43\0\1\303\64\0\1\304" +
                    "\37\0\1\305\51\0\1\306\51\0\1\307\51\0\1\310" +
                    "\53\0\1\311\46\0\1\312\63\0\1\313\47\0\1\314" +
                    "\41\0\1\315\64\0\1\316\53\0\1\317\35\0\1\320" +
                    "\51\0\1\321\51\0\1\322\51\0\1\323\51\0\1\324" +
                    "\65\0\1\325\32\0\1\326\52\0\1\327\70\0\1\330" +
                    "\46\0\1\331\50\0\1\332\53\0\1\333\36\0\1\334" +
                    "\51\0\1\335\51\0\1\336\51\0\1\337\51\0\1\340" +
                    "\65\0\1\341\32\0\1\342\52\0\1\343\70\0\1\344" +
                    "\42\0\1\345\41\0\1\346\54\0\1\347\50\0\1\350" +
                    "\51\0\1\351\51\0\1\352\51\0\1\353\51\0\1\354" +
                    "\65\0\1\355\32\0\1\356\52\0\1\357\70\0\1\360" +
                    "\33\0\1\361\64\0\1\362\53\0\1\363\22\0";
    /* 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 =
            "\15\0\1\11\1\1\1\11\25\1\4\0\1\1\3\0" +
                    "\1\1\2\0\1\1\2\0\1\1\2\0\1\1\2\0" +
                    "\1\1\2\0\1\1\2\0\1\1\2\0\1\1\70\0" +
                    "\1\11\51\0\1\11\114\0\1\11";
    /* user code: */
    public static boolean DEBUG = false;
    /**
     * the input device
     */
    private java.io.Reader zzReader;
    /**
     * the current state of the DFA
     */
    private int zzState;
    /**
     * 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;

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

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

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

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

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

    /**
     * Runs the scanner on input files.
     * <p/>
     * 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 MOptaLexer <inputfile>");
        } else {
            for (int i = 0; i < argv.length; i++) {
                MOptaLexer scanner = null;
                try {
                    scanner = new MOptaLexer(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();
                }
            }
        }
    }

    /**
     * Refills the input buffer.
     *
     * @return <code>false</code>, iff there was new input.
     * @throws 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.
     * <p/>
     * 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.
     * <p/>
     * 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.
     * <p/>
     * 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.).
     * <p/>
     * 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.
     * <p/>
     * 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
     * @throws 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("MOptaFlex: Found the energy");
                    if (Settings.DEBUG) System.out.println(yytext());
                    yybegin(ITER5);
                    return new Symbol(MOptaSym.ENERGY, new Float(yytext()));
                }
                case 15:
                    break;
                case 7: {
                    if (Settings.DEBUG) System.out.println("MOptaFlex: Found float3");
                    if (Settings.DEBUG) System.out.println(yytext());
                    yybegin(ITER8);
                    return new Symbol(MOptaSym.FLOAT3);
                }
                case 16:
                    break;
                case 8: {
                    if (Settings.DEBUG) System.out.println("MOptaFlex: Found float5");
                    if (Settings.DEBUG) System.out.println(yytext());
                    yybegin(ITER10);
                    return new Symbol(MOptaSym.FLOAT5);
                }
                case 17:
                    break;
                case 3: {
                    if (Settings.DEBUG) System.out.println("MOptaFlex: Found float4");
                    if (Settings.DEBUG) System.out.println(yytext());
                    yybegin(ITER9);
                    return new Symbol(MOptaSym.FLOAT4);
                }
                case 18:
                    break;
                case 12: {
                    yybegin(IGNOREALL);
                    return new Symbol(MOptaSym.SCFDONE);
                }
                case 19:
                    break;
                case 11: {
                    if (Settings.DEBUG) System.out.println("MOptaFlex: Found float8");
                    if (Settings.DEBUG) System.out.println(yytext());
                    yybegin(ITER);
                    return new Symbol(MOptaSym.FLOAT8);
                }
                case 20:
                    break;
                case 10: {
                    if (Settings.DEBUG) System.out.println("MOptaFlex: Found float7");
                    if (Settings.DEBUG) System.out.println(yytext());
                    yybegin(ITER12);
                    return new Symbol(MOptaSym.FLOAT7);
                }
                case 21:
                    break;
                case 6: {
                    if (Settings.DEBUG) System.out.println("MOptaFlex: Found float2");
                    if (Settings.DEBUG) System.out.println(yytext());
                    yybegin(ITER7);
                    return new Symbol(MOptaSym.FLOAT2);
                }
                case 22:
                    break;
                case 2: {
                    if (Settings.DEBUG) System.out.println("MOptaFlex: Found the first integer in the iteration");
                    if (Settings.DEBUG) System.out.println(yytext());
                    yybegin(ITER4);
                    return new Symbol(MOptaSym.INTCycle, new Integer(yytext()));
                }
                case 23:
                    break;
                case 14: {
                    if (Settings.DEBUG) System.out.println("MOptaFlex: Found START OF");
                    yybegin(ITER);
                    return new Symbol(MOptaSym.FOUNDITER);
                }
                case 24:
                    break;
                case 9: {
                    if (Settings.DEBUG) System.out.println("MOptaFlex: Found float6");
                    if (Settings.DEBUG) System.out.println(yytext());
                    yybegin(ITER11);
                    return new Symbol(MOptaSym.FLOAT6);
                }
                case 25:
                    break;
                case 13: {
                    if (Settings.DEBUG) System.out.println("MOptaFlex: Found the dash");
                    yybegin(DASH);
                }
                case 26:
                    break;
                case 1: {
                }
                case 27:
                    break;
                case 5: {
                    if (Settings.DEBUG) System.out.println("MOptaFlex: ITER5");
                    if (Settings.DEBUG) System.out.println("MOptaFlex: Found float1");
                    System.out.println(yytext());
                    yybegin(ITER6);
                    return new Symbol(MOptaSym.FLOAT1);
                }
                case 28:
                    break;
                default:
                    if (zzInput == YYEOF && zzStartRead == zzCurrentPos) {
                        zzAtEOF = true;
                        zzDoEOF();
                        {
                            return new java_cup.runtime.Symbol(MOptaSym.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
     * <p/>
     * This code was contributed by Karl Meissner <meissnersd@yahoo.com>
     */
    private String getTokenName(int token) {
        try {
            java.lang.reflect.Field[] classFields = MOptaSym.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.
     * <p/>
     * 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;
    }


}
