/* Generated By:JavaCC: Do not edit this line. NomParser.java */ /* * Copyright (C) 2003-2007 University of Manchester * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * (or see http://www.gnu.org/copyleft/lesser.html) */ package org.openscience.cdk.iupac.parser; import java.io.StringReader; import org.openscience.cdk.Molecule; import org.openscience.cdk.exception.*; import java.util.*; /** * A class partly generated by <a href="http://javacc.dev.java.net" target="_top">JavaCC</a> which breaks down the chemical name * into computable subparts and passes these parts to the MoleculeBuilder. * * @author David Robinson (University of Manchester) * @author Bhupinder Sandhu * @author Stephen Tomkinson * * @cdk.keyword IUPAC name */ public class NomParser implements NomParserConstants { //private variables needed throughout the program private static int mainChainPrefix; private static boolean isMainCyclic; /** The tempory vector of locations the current group/substiuant is attached to */ private static Vector tempLocation; /** The vector of attached functional groups, with an instance of AttachedGroup for each * functional group. */ private static Vector attachedGroups; /** The vector of attached substituent, with an instance of AttachedGroup for each * substituent. */ private static Vector attachedSubstituents; /** * Used in the build up of ancient greek style prfixes */ private static int currentNumber; /** * Parses the chemical name and returns the built molecule. * * @param stringToParse A case-insensitive name of the chemical to build. * @return A molecule which represents the interpretatation of the name. * @throws ParseException Any error which occur in the parsing get wrapped * up in a ParseException and thrown. */ public static Molecule generate (String stringToParse) throws ParseException, CDKException { isMainCyclic = false; tempLocation = new Vector(); attachedSubstituents = new Vector(); attachedGroups = new Vector(); currentNumber = 0; StringReader stringReader = new StringReader (stringToParse.toLowerCase() + "\n"); NomParser parser = new NomParser (stringReader); parser.completeChemicalName(); //Scan substituents for a too high connection point checkConnections (attachedSubstituents.iterator()); //Scan functional groups for a too high connection point checkConnections (attachedGroups.iterator()); MoleculeBuilder moleculeBuilder = new MoleculeBuilder(); Molecule returnedMolecule = moleculeBuilder.buildMolecule(mainChainPrefix, attachedSubstituents, attachedGroups, isMainCyclic, stringToParse); return returnedMolecule; } /** * Checks to ensure that all groups/substituents attached to the main chain * are connected to a valid atom which occurs on the main chain. * * @param vectorIterator An iterator which provides instances of AttachedGroup to check * @throws ParseException A taylored instance of ParseException so nomen can display * the error to the user. */ private static void checkConnections (Iterator vectorIterator) throws ParseException { while (vectorIterator.hasNext()) { AttachedGroup ag = (AttachedGroup) vectorIterator.next(); Vector locations = ag.getLocations(); Iterator locationsIterator = locations.iterator(); while (locationsIterator.hasNext()) { Token tok = (Token) locationsIterator.next(); try { if (Integer.parseInt(tok.image) > mainChainPrefix) { //Create a tiny 2D array with a single slot for data, //insert 0 into it as as to reference the first slot in the stringArray int [][] intArray = new int [1][1]; intArray [0][0] = 0; //Put useful message in stringArray String [] stringArray = new String [1]; stringArray [0] = " MUST BE BELOW " + (mainChainPrefix + 1) + " "; tok.next = tok; throw new ParseException (tok, intArray, stringArray); } } catch (NumberFormatException nfe) { //Do nothing, as this should never happen } } } } /** * Stores "head tokens", the substituent prefix, in a vector of AttachedGroup objects. */ void AddHeadToken() throws ParseException { attachedSubstituents.add (new AttachedGroup (tempLocation, currentNumber) ); tempLocation = new Vector(); } void MakeMainChainIntoSubstituent() throws ParseException { attachedSubstituents.add (new AttachedGroup (tempLocation, mainChainPrefix) ); currentNumber = 0; mainChainPrefix = 0; tempLocation = new Vector(); } /** * Stores the functional groups in a vector of AttachedGroup objects. */ void AddFunGroup() throws ParseException { Token tok; tok = getToken(-1); attachedGroups.add (new AttachedGroup (tempLocation, tok.image) ); tempLocation = new Vector(); } /** * Stores the functional group positions, the number of the atom they * connect to, in an array. */ void AddFunGroupPos() throws ParseException { Token tok; tok = getToken(-1); tempLocation.add(tok); } /** * Adds to the position array a location of -1 to indicate no location was * specified. */ void AddUnknownFunGroupPos() throws ParseException { Token tok = new Token(); tok.image = "-1"; tempLocation.add(tok); } /** * Store the mainChainPrefix token, the chain prefix of the longest carbon chain */ void AddMainChain() throws ParseException { mainChainPrefix = currentNumber; currentNumber = 0; } /** * Sets the main chain to be cyclic. */ void SetMainCyclic() throws ParseException { isMainCyclic = true; } /** * The general form all chemical names must follow. */ final public void completeChemicalName() throws ParseException { if (jj_2_1(2)) { mainChainConstruct(); } else { prefixConstruct(); mainChainConstruct(); jj_consume_token(EOL); } } /** * Allows 1 or more prefixes */ final public void prefixConstruct() throws ParseException { prefixType(); label_1: while (true) { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case DASH: ; break; default: jj_la1[0] = jj_gen; break label_1; } jj_consume_token(DASH); prefixType(); } } final public void prefixType() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case CONSTANT: attachLocationSpecified(); break; default: jj_la1[1] = jj_gen; AddUnknownFunGroupPos(); } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case METH: case ETH: case PROP: case BUT: case UNDEC: case EICOS: case HENICOS: case HEN: case DO: case TRI: case TETR: case PENT: case HEX: case HEPT: case OCT: case NON: case DEC: subChain(); break; case CHLORO: case FLUORO: case BROMO: case IODO: case NITRO: case OXO: case PHENYL: case AMINO: case HYDROXY: functionalGroupPrefix(); break; default: jj_la1[2] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } /** The substituent part of the prefix */ final public void subChain() throws ParseException { chainPrefix(); AddHeadToken(); jj_consume_token(YL); } /** * An attach position has been specified using a * comma seperated list followed by a dash */ final public void attachLocationSpecified() throws ParseException { jj_consume_token(CONSTANT); AddFunGroupPos(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case DASH: oneAttachLocation(); break; case COMMA: twoOrThreeAttachLocations(); break; default: jj_la1[3] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } /** * Only one attach location specified, should be followed by a dash. */ final public void oneAttachLocation() throws ParseException { jj_consume_token(DASH); } /** * Two or three attach locations specidied, handle the second and if needed, the third one here. */ final public void twoOrThreeAttachLocations() throws ParseException { jj_consume_token(COMMA); jj_consume_token(CONSTANT); AddFunGroupPos(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case DASH: jj_consume_token(DASH); jj_consume_token(DI); break; case COMMA: jj_consume_token(COMMA); jj_consume_token(CONSTANT); AddFunGroupPos(); jj_consume_token(DASH); jj_consume_token(TRI); break; default: jj_la1[4] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } /** * A list of known tokens denoting a chain's length. */ final public void chainPrefix() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case METH: case ETH: case PROP: case BUT: case UNDEC: case EICOS: case HENICOS: case DEC: specialCase(); break; case HEN: case DO: case TRI: case TETR: case PENT: case HEX: case HEPT: case OCT: case NON: allBaseNumbers(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case HEN: case DO: case TRI: case TETR: case PENT: case HEX: case HEPT: case OCT: case NON: case DEC: case COS: case CONT: switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case HEN: case DO: case TRI: case TETR: case PENT: case HEX: case HEPT: case OCT: case NON: tensWithUnits(); break; case DEC: case COS: case CONT: tensNoUnits(); break; default: jj_la1[5] = jj_gen; jj_consume_token(-1); throw new ParseException(); } break; default: jj_la1[6] = jj_gen; ; } break; default: jj_la1[7] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } /** Deal with special cases where the rules don't apply. */ final public void specialCase() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case METH: jj_consume_token(METH); currentNumber = 1; break; case ETH: jj_consume_token(ETH); currentNumber = 2; break; case PROP: jj_consume_token(PROP); currentNumber = 3; break; case BUT: jj_consume_token(BUT); currentNumber = 4; break; case DEC: jj_consume_token(DEC); currentNumber = 10; break; case UNDEC: jj_consume_token(UNDEC); currentNumber = 11; break; case EICOS: jj_consume_token(EICOS); currentNumber = 20; break; case HENICOS: jj_consume_token(HENICOS); currentNumber = 21; break; default: jj_la1[8] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } /** The usual numbers .*/ final public void allBaseNumbers() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case HEN: jj_consume_token(HEN); currentNumber = 1; break; case DO: jj_consume_token(DO); currentNumber = 2; break; case TRI: jj_consume_token(TRI); currentNumber = 3; break; case TETR: jj_consume_token(TETR); currentNumber = 4; break; case PENT: jj_consume_token(PENT); currentNumber = 5; break; case HEX: jj_consume_token(HEX); currentNumber = 6; break; case HEPT: jj_consume_token(HEPT); currentNumber = 7; break; case OCT: jj_consume_token(OCT); currentNumber = 8; break; case NON: jj_consume_token(NON); currentNumber = 9; break; default: jj_la1[9] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } /** Deal with fragments refering to the positioning of the base numbers (denoting their magnitude) */ final public void tensNoUnits() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case DEC: jj_consume_token(DEC); currentNumber += 10; break; case COS: jj_consume_token(COS); currentNumber += 20; break; case CONT: jj_consume_token(CONT); currentNumber *= 10; break; default: jj_la1[10] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } /** * Deals with numbers above 30 where the base numbers set appear twice. * For example, in the tens and the units. */ final public void tensWithUnits() throws ParseException { int tempBackup; tempBackup = currentNumber; allBaseNumbers(); jj_consume_token(CONT); currentNumber *= 10; currentNumber += tempBackup; } /** The functional group part of the prefix */ final public void functionalGroupPrefix() throws ParseException { prefixFunctionalGroups(); AddFunGroup(); } /** * Main chains are compulsary and consist of an optional "cyclo", a length prefix and * a posfix denoting functional groups. */ final public void mainChainConstruct() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case CYCLO: cycle(); break; default: jj_la1[11] = jj_gen; ; } mainChainPrefix(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case YL: jj_consume_token(YL); AddUnknownFunGroupPos(); MakeMainChainIntoSubstituent(); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case LITHIUM: case SODIUM: case POTASSIUM: case RUBIDIUM: case CESIUM: case FRANCIUM: case BERYLLIUM: case MAGNESIUM: case CALCIUM: case STRONTIUM: case BARIUM: case RADIUM: case SCANDIUM: case YTTRIUM: case LANTHANUM: case ACTINIUM: case TITANIUM: case ZIRCONIUM: case HAFNIUM: case RUTHERFORDIUM: case VANADIUM: case NIOBIUM: case TANTALUM: case DUBNIUM: case CHROMIUM: case MOLYBDENUM: case TUNGSTEN: case SEABORGIUM: case MANGANESE: case TECHNETIUM: case RHENIUM: case BOHRIUM: case IRON: case RUTHENIUM: case OSMIUM: case HASSIUM: case COBALT: case RHODIUM: case IRIDIUM: case MEITMERIUM: case NICKEL: case PALLADIUM: case PLATINUM: case COPPER: case SILVER: case GOLD: case ZINC: case CADMIUM: case MECURY: case ALUMINIUM: case GALLIUM: case INDIUM: case THALLIUM: case GERMAINIUM: case TIN: case LEAD: case ARSENIC: case ANTIMONY: case BISMUTH: case SELENIUM: case TELLURIUM: case POLONIUM: case CERIUM: case PRASEODYMIUM: case NEODYMIUM: case PROMETHIUM: case SANARIUM: case EUROPIUM: case GADOLINIUM: case TERBIUM: case DYSPROSIUM: case HOLMIUM: case ERBIUM: case THULIUM: case YTTERBIUM: case LUTETIUM: case THORIUM: case PROTACTINIUM: case URANIUM: case NEPTUNIUM: case PLUTONIUM: case AMERCIUM: case CURIUM: case BERKELIUM: case CALIFORNIUM: case EINSTEINIUM: case FERMIUM: case MENDELEVIUM: case NOBELIUM: case LAWRENCIUM: prioritySubstituents(); break; case METH: case ETH: case PROP: case BUT: case UNDEC: case EICOS: case HENICOS: case HEN: case DO: case TRI: case TETR: case PENT: case HEX: case HEPT: case OCT: case NON: case DEC: mainChainPrefix(); jj_consume_token(AN); prioritySubstituentsFunGroups(); break; default: jj_la1[12] = jj_gen; jj_consume_token(-1); throw new ParseException(); } AddUnknownFunGroupPos(); AddFunGroup(); break; default: jj_la1[13] = jj_gen; bondType(); mainChainSuffix(); } } /** * Deals with cyclic main chains. */ final public void cycle() throws ParseException { jj_consume_token(CYCLO); SetMainCyclic(); } /** * Deal with the main chain's length. */ final public void mainChainPrefix() throws ParseException { chainPrefix(); AddMainChain(); } /** * Tokens which affect the bond order of the first bond. */ final public void bondType() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case AN: jj_consume_token(AN); AddUnknownFunGroupPos(); break; default: jj_la1[16] = jj_gen; switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case DASH: jj_consume_token(DASH); attachLocationSpecified(); break; default: jj_la1[14] = jj_gen; AddUnknownFunGroupPos(); } switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case EN: jj_consume_token(EN); break; case YN: jj_consume_token(YN); break; default: jj_la1[15] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } AddFunGroup(); } /** * Figure out the functional group by the main chain's suffix. */ final public void mainChainSuffix() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case E: case OICACID: case OYLCHLORIDE: case AL: case AMIDE: case AMINE: case ONE: case OATE: endFunctionalGroups(); break; case DASH: case OL: connectingFunctionalGroupsConstruct(); break; default: jj_la1[17] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } /** * Functional groups which occur at the end of the main chain and need * a connecting "an". */ final public void endFunctionalGroups() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case E: jj_consume_token(E); switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case NITRILE: jj_consume_token(NITRILE); break; default: jj_la1[18] = jj_gen; ; } break; case AMIDE: jj_consume_token(AMIDE); break; case AMINE: jj_consume_token(AMINE); break; case OATE: jj_consume_token(OATE); break; case ONE: jj_consume_token(ONE); break; case OICACID: jj_consume_token(OICACID); break; case OYLCHLORIDE: jj_consume_token(OYLCHLORIDE); break; case AL: jj_consume_token(AL); break; default: jj_la1[19] = jj_gen; jj_consume_token(-1); throw new ParseException(); } AddUnknownFunGroupPos(); AddFunGroup(); } /** * The layout of a functional group(s) which can connect anywhere. * No number specified, or a number list specified. */ final public void connectingFunctionalGroupsConstruct() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case OL: connectingFunctionalGroupSuffix(); AddUnknownFunGroupPos(); break; case DASH: jj_consume_token(DASH); attachLocationSpecified(); connectingFunctionalGroupSuffix(); break; default: jj_la1[20] = jj_gen; jj_consume_token(-1); throw new ParseException(); } AddFunGroup(); } /** * Functional groups suffixs for groups which can be connected anywhere * along the main chain. */ final public void connectingFunctionalGroupSuffix() throws ParseException { jj_consume_token(OL); } final public void prefixFunctionalGroups() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case CHLORO: jj_consume_token(CHLORO); break; case BROMO: jj_consume_token(BROMO); break; case IODO: jj_consume_token(IODO); break; case FLUORO: jj_consume_token(FLUORO); break; case NITRO: jj_consume_token(NITRO); break; case OXO: jj_consume_token(OXO); break; case PHENYL: jj_consume_token(PHENYL); break; case AMINO: jj_consume_token(AMINO); break; case HYDROXY: jj_consume_token(HYDROXY); break; default: jj_la1[21] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } /** * Things which have sub chains branching off them and the molecule does have a main chain. */ final public void prioritySubstituentsFunGroups() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case AMINE: jj_consume_token(AMINE); break; case AMIDE: jj_consume_token(AMIDE); break; case OATE: jj_consume_token(OATE); break; case ONE: jj_consume_token(ONE); break; default: jj_la1[22] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } /** * Things which have sub chains branching off them but the molecule has no main chain. */ final public void prioritySubstituents() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case LITHIUM: case SODIUM: case POTASSIUM: case RUBIDIUM: case CESIUM: case FRANCIUM: groupOneMetals(); break; case BERYLLIUM: case MAGNESIUM: case CALCIUM: case STRONTIUM: case BARIUM: case RADIUM: groupTwoMetals(); break; case SCANDIUM: case YTTRIUM: case LANTHANUM: case ACTINIUM: case TITANIUM: case ZIRCONIUM: case HAFNIUM: case RUTHERFORDIUM: case VANADIUM: case NIOBIUM: case TANTALUM: case DUBNIUM: case CHROMIUM: case MOLYBDENUM: case TUNGSTEN: case SEABORGIUM: case MANGANESE: case TECHNETIUM: case RHENIUM: case BOHRIUM: case IRON: case RUTHENIUM: case OSMIUM: case HASSIUM: case COBALT: case RHODIUM: case IRIDIUM: case MEITMERIUM: case NICKEL: case PALLADIUM: case PLATINUM: case COPPER: case SILVER: case GOLD: case ZINC: case CADMIUM: case MECURY: dBlockMetals(); break; case ALUMINIUM: case GALLIUM: case INDIUM: case THALLIUM: case GERMAINIUM: case TIN: case LEAD: case ARSENIC: case ANTIMONY: case BISMUTH: case SELENIUM: case TELLURIUM: case POLONIUM: pBlockMetals(); break; case CERIUM: case PRASEODYMIUM: case NEODYMIUM: case PROMETHIUM: case SANARIUM: case EUROPIUM: case GADOLINIUM: case TERBIUM: case DYSPROSIUM: case HOLMIUM: case ERBIUM: case THULIUM: case YTTERBIUM: case LUTETIUM: case THORIUM: case PROTACTINIUM: case URANIUM: case NEPTUNIUM: case PLUTONIUM: case AMERCIUM: case CURIUM: case BERKELIUM: case CALIFORNIUM: case EINSTEINIUM: case FERMIUM: case MENDELEVIUM: case NOBELIUM: case LAWRENCIUM: fBlockMetals(); break; default: jj_la1[23] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } final public void groupOneMetals() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case LITHIUM: jj_consume_token(LITHIUM); break; case SODIUM: jj_consume_token(SODIUM); break; case POTASSIUM: jj_consume_token(POTASSIUM); break; case RUBIDIUM: jj_consume_token(RUBIDIUM); break; case CESIUM: jj_consume_token(CESIUM); break; case FRANCIUM: jj_consume_token(FRANCIUM); break; default: jj_la1[24] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } final public void groupTwoMetals() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case BERYLLIUM: jj_consume_token(BERYLLIUM); break; case MAGNESIUM: jj_consume_token(MAGNESIUM); break; case CALCIUM: jj_consume_token(CALCIUM); break; case STRONTIUM: jj_consume_token(STRONTIUM); break; case BARIUM: jj_consume_token(BARIUM); break; case RADIUM: jj_consume_token(RADIUM); break; default: jj_la1[25] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } final public void dBlockMetals() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case SCANDIUM: jj_consume_token(SCANDIUM); break; case YTTRIUM: jj_consume_token(YTTRIUM); break; case LANTHANUM: jj_consume_token(LANTHANUM); break; case ACTINIUM: jj_consume_token(ACTINIUM); break; case TITANIUM: jj_consume_token(TITANIUM); break; case ZIRCONIUM: jj_consume_token(ZIRCONIUM); break; case HAFNIUM: jj_consume_token(HAFNIUM); break; case RUTHERFORDIUM: jj_consume_token(RUTHERFORDIUM); break; case VANADIUM: jj_consume_token(VANADIUM); break; case NIOBIUM: jj_consume_token(NIOBIUM); break; case TANTALUM: jj_consume_token(TANTALUM); break; case DUBNIUM: jj_consume_token(DUBNIUM); break; case CHROMIUM: jj_consume_token(CHROMIUM); break; case MOLYBDENUM: jj_consume_token(MOLYBDENUM); break; case TUNGSTEN: jj_consume_token(TUNGSTEN); break; case SEABORGIUM: jj_consume_token(SEABORGIUM); break; case MANGANESE: jj_consume_token(MANGANESE); break; case TECHNETIUM: jj_consume_token(TECHNETIUM); break; case RHENIUM: jj_consume_token(RHENIUM); break; case BOHRIUM: jj_consume_token(BOHRIUM); break; case IRON: jj_consume_token(IRON); break; case RUTHENIUM: jj_consume_token(RUTHENIUM); break; case OSMIUM: jj_consume_token(OSMIUM); break; case HASSIUM: jj_consume_token(HASSIUM); break; case COBALT: jj_consume_token(COBALT); break; case RHODIUM: jj_consume_token(RHODIUM); break; case IRIDIUM: jj_consume_token(IRIDIUM); break; case MEITMERIUM: jj_consume_token(MEITMERIUM); break; case NICKEL: jj_consume_token(NICKEL); break; case PALLADIUM: jj_consume_token(PALLADIUM); break; case PLATINUM: jj_consume_token(PLATINUM); break; case COPPER: jj_consume_token(COPPER); break; case SILVER: jj_consume_token(SILVER); break; case GOLD: jj_consume_token(GOLD); break; case ZINC: jj_consume_token(ZINC); break; case CADMIUM: jj_consume_token(CADMIUM); break; case MECURY: jj_consume_token(MECURY); break; default: jj_la1[26] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } final public void pBlockMetals() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case ALUMINIUM: jj_consume_token(ALUMINIUM); break; case GALLIUM: jj_consume_token(GALLIUM); break; case INDIUM: jj_consume_token(INDIUM); break; case THALLIUM: jj_consume_token(THALLIUM); break; case GERMAINIUM: jj_consume_token(GERMAINIUM); break; case TIN: jj_consume_token(TIN); break; case LEAD: jj_consume_token(LEAD); break; case ARSENIC: jj_consume_token(ARSENIC); break; case ANTIMONY: jj_consume_token(ANTIMONY); break; case BISMUTH: jj_consume_token(BISMUTH); break; case SELENIUM: jj_consume_token(SELENIUM); break; case TELLURIUM: jj_consume_token(TELLURIUM); break; case POLONIUM: jj_consume_token(POLONIUM); break; default: jj_la1[27] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } final public void fBlockMetals() throws ParseException { switch ((jj_ntk==-1)?jj_ntk():jj_ntk) { case CERIUM: jj_consume_token(CERIUM); break; case PRASEODYMIUM: jj_consume_token(PRASEODYMIUM); break; case NEODYMIUM: jj_consume_token(NEODYMIUM); break; case PROMETHIUM: jj_consume_token(PROMETHIUM); break; case SANARIUM: jj_consume_token(SANARIUM); break; case EUROPIUM: jj_consume_token(EUROPIUM); break; case GADOLINIUM: jj_consume_token(GADOLINIUM); break; case TERBIUM: jj_consume_token(TERBIUM); break; case DYSPROSIUM: jj_consume_token(DYSPROSIUM); break; case HOLMIUM: jj_consume_token(HOLMIUM); break; case ERBIUM: jj_consume_token(ERBIUM); break; case THULIUM: jj_consume_token(THULIUM); break; case YTTERBIUM: jj_consume_token(YTTERBIUM); break; case LUTETIUM: jj_consume_token(LUTETIUM); break; case THORIUM: jj_consume_token(THORIUM); break; case PROTACTINIUM: jj_consume_token(PROTACTINIUM); break; case URANIUM: jj_consume_token(URANIUM); break; case NEPTUNIUM: jj_consume_token(NEPTUNIUM); break; case PLUTONIUM: jj_consume_token(PLUTONIUM); break; case AMERCIUM: jj_consume_token(AMERCIUM); break; case CURIUM: jj_consume_token(CURIUM); break; case BERKELIUM: jj_consume_token(BERKELIUM); break; case CALIFORNIUM: jj_consume_token(CALIFORNIUM); break; case EINSTEINIUM: jj_consume_token(EINSTEINIUM); break; case FERMIUM: jj_consume_token(FERMIUM); break; case MENDELEVIUM: jj_consume_token(MENDELEVIUM); break; case NOBELIUM: jj_consume_token(NOBELIUM); break; case LAWRENCIUM: jj_consume_token(LAWRENCIUM); break; default: jj_la1[28] = jj_gen; jj_consume_token(-1); throw new ParseException(); } } final private boolean jj_2_1(int xla) { jj_la = xla; jj_lastpos = jj_scanpos = token; try { return !jj_3_1(); } catch(LookaheadSuccess ls) { return true; } finally { jj_save(0, xla); } } final private boolean jj_3R_15() { if (jj_scan_token(BUT)) return true; return false; } final private boolean jj_3R_14() { if (jj_scan_token(PROP)) return true; return false; } final private boolean jj_3R_13() { if (jj_scan_token(ETH)) return true; return false; } final private boolean jj_3R_9() { Token xsp; xsp = jj_scanpos; if (jj_3R_12()) { jj_scanpos = xsp; if (jj_3R_13()) { jj_scanpos = xsp; if (jj_3R_14()) { jj_scanpos = xsp; if (jj_3R_15()) { jj_scanpos = xsp; if (jj_3R_16()) { jj_scanpos = xsp; if (jj_3R_17()) { jj_scanpos = xsp; if (jj_3R_18()) { jj_scanpos = xsp; if (jj_3R_19()) return true; } } } } } } } return false; } final private boolean jj_3R_12() { if (jj_scan_token(METH)) return true; return false; } final private boolean jj_3R_30() { if (jj_3R_32()) return true; return false; } final private boolean jj_3R_31() { if (jj_3R_10()) return true; return false; } final private boolean jj_3R_7() { if (jj_3R_9()) return true; return false; } final private boolean jj_3R_6() { Token xsp; xsp = jj_scanpos; if (jj_3R_7()) { jj_scanpos = xsp; if (jj_3R_8()) return true; } return false; } final private boolean jj_3R_4() { if (jj_3R_6()) return true; if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;} return false; } final private boolean jj_3R_35() { if (jj_scan_token(CONT)) return true; return false; } final private boolean jj_3R_34() { if (jj_scan_token(COS)) return true; return false; } final private boolean jj_3R_33() { if (jj_scan_token(DEC)) return true; return false; } final private boolean jj_3R_32() { Token xsp; xsp = jj_scanpos; if (jj_3R_33()) { jj_scanpos = xsp; if (jj_3R_34()) { jj_scanpos = xsp; if (jj_3R_35()) return true; } } return false; } final private boolean jj_3R_5() { if (jj_scan_token(CYCLO)) return true; if (true) { jj_la = 0; jj_scanpos = jj_lastpos; return false;} return false; } final private boolean jj_3R_29() { if (jj_3R_31()) return true; return false; } final private boolean jj_3R_11() { Token xsp; xsp = jj_scanpos; if (jj_3R_29()) { jj_scanpos = xsp; if (jj_3R_30()) return true; } return false; } final private boolean jj_3R_28() { if (jj_scan_token(NON)) return true; return false; } final private boolean jj_3R_27() { if (jj_scan_token(OCT)) return true; return false; } final private boolean jj_3R_26() { if (jj_scan_token(HEPT)) return true; return false; } final private boolean jj_3R_25() { if (jj_scan_token(HEX)) return true; return false; } final private boolean jj_3R_24() { if (jj_scan_token(PENT)) return true; return false; } final private boolean jj_3R_23() { if (jj_scan_token(TETR)) return true; return false; } final private boolean jj_3R_22() { if (jj_scan_token(TRI)) return true; return false; } final private boolean jj_3R_3() { if (jj_3R_5()) return true; return false; } final private boolean jj_3R_21() { if (jj_scan_token(DO)) return true; return false; } final private boolean jj_3R_2() { Token xsp; xsp = jj_scanpos; if (jj_3R_3()) jj_scanpos = xsp; if (jj_3R_4()) return true; return false; } final private boolean jj_3_1() { if (jj_3R_2()) return true; return false; } final private boolean jj_3R_20() { if (jj_scan_token(HEN)) return true; return false; } final private boolean jj_3R_10() { Token xsp; xsp = jj_scanpos; if (jj_3R_20()) { jj_scanpos = xsp; if (jj_3R_21()) { jj_scanpos = xsp; if (jj_3R_22()) { jj_scanpos = xsp; if (jj_3R_23()) { jj_scanpos = xsp; if (jj_3R_24()) { jj_scanpos = xsp; if (jj_3R_25()) { jj_scanpos = xsp; if (jj_3R_26()) { jj_scanpos = xsp; if (jj_3R_27()) { jj_scanpos = xsp; if (jj_3R_28()) return true; } } } } } } } } return false; } final private boolean jj_3R_8() { if (jj_3R_10()) return true; Token xsp; xsp = jj_scanpos; if (jj_3R_11()) jj_scanpos = xsp; return false; } final private boolean jj_3R_19() { if (jj_scan_token(HENICOS)) return true; return false; } final private boolean jj_3R_18() { if (jj_scan_token(EICOS)) return true; return false; } final private boolean jj_3R_17() { if (jj_scan_token(UNDEC)) return true; return false; } final private boolean jj_3R_16() { if (jj_scan_token(DEC)) return true; return false; } public NomParserTokenManager token_source; SimpleCharStream jj_input_stream; public Token token, jj_nt; private int jj_ntk; private Token jj_scanpos, jj_lastpos; private int jj_la; public boolean lookingAhead = false; private boolean jj_semLA; private int jj_gen; final private int[] jj_la1 = new int[29]; static private int[] jj_la1_0; static private int[] jj_la1_1; static private int[] jj_la1_2; static private int[] jj_la1_3; static private int[] jj_la1_4; static { jj_la1_0(); jj_la1_1(); jj_la1_2(); jj_la1_3(); jj_la1_4(); } private static void jj_la1_0() { jj_la1_0 = new int[] {0x10,0x4,0x7fffc0,0x30,0x30,0x1ffe000,0x1ffe000,0x7fffc0,0x401fc0,0x3fe000,0x1c00000,0x0,0x7fffc0,0x40000000,0x10,0x30000000,0x8000000,0x10,0x0,0x0,0x10,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,}; } private static void jj_la1_1() { jj_la1_1 = new int[] {0x0,0x0,0x9fe,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x1,0xffc00000,0x0,0x0,0x0,0x0,0x3ef000,0x10000,0x3ed000,0x2000,0x9fe,0x3c0000,0xffc00000,0xfc00000,0xf0000000,0x0,0x0,0x0,}; } private static void jj_la1_2() { jj_la1_2 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xffffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xffffffff,0x0,0x3,0xfffffffc,0x0,0x0,}; } private static void jj_la1_3() { jj_la1_3 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xffffffff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xffffffff,0x0,0x0,0x7f,0xfff80,0xfff00000,}; } private static void jj_la1_4() { jj_la1_4 = new int[] {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xffff,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0xffff,0x0,0x0,0x0,0x0,0xffff,}; } final private JJCalls[] jj_2_rtns = new JJCalls[1]; private boolean jj_rescan = false; private int jj_gc = 0; public NomParser(java.io.InputStream stream) { jj_input_stream = new SimpleCharStream(stream, 1, 1); token_source = new NomParserTokenManager(jj_input_stream); token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 29; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } public void ReInit(java.io.InputStream stream) { jj_input_stream.ReInit(stream, 1, 1); token_source.ReInit(jj_input_stream); token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 29; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } public NomParser(java.io.Reader stream) { jj_input_stream = new SimpleCharStream(stream, 1, 1); token_source = new NomParserTokenManager(jj_input_stream); token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 29; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } public void ReInit(java.io.Reader stream) { jj_input_stream.ReInit(stream, 1, 1); token_source.ReInit(jj_input_stream); token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 29; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } public NomParser(NomParserTokenManager tm) { token_source = tm; token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 29; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } public void ReInit(NomParserTokenManager tm) { token_source = tm; token = new Token(); jj_ntk = -1; jj_gen = 0; for (int i = 0; i < 29; i++) jj_la1[i] = -1; for (int i = 0; i < jj_2_rtns.length; i++) jj_2_rtns[i] = new JJCalls(); } final private Token jj_consume_token(int kind) throws ParseException { Token oldToken; if ((oldToken = token).next != null) token = token.next; else token = token.next = token_source.getNextToken(); jj_ntk = -1; if (token.kind == kind) { jj_gen++; if (++jj_gc > 100) { jj_gc = 0; for (int i = 0; i < jj_2_rtns.length; i++) { JJCalls c = jj_2_rtns[i]; while (c != null) { if (c.gen < jj_gen) c.first = null; c = c.next; } } } return token; } token = oldToken; jj_kind = kind; throw generateParseException(); } static private final class LookaheadSuccess extends java.lang.Error { } final private LookaheadSuccess jj_ls = new LookaheadSuccess(); final private boolean jj_scan_token(int kind) { if (jj_scanpos == jj_lastpos) { jj_la--; if (jj_scanpos.next == null) { jj_lastpos = jj_scanpos = jj_scanpos.next = token_source.getNextToken(); } else { jj_lastpos = jj_scanpos = jj_scanpos.next; } } else { jj_scanpos = jj_scanpos.next; } if (jj_rescan) { int i = 0; Token tok = token; while (tok != null && tok != jj_scanpos) { i++; tok = tok.next; } if (tok != null) jj_add_error_token(kind, i); } if (jj_scanpos.kind != kind) return true; if (jj_la == 0 && jj_scanpos == jj_lastpos) throw jj_ls; return false; } final public Token getNextToken() { if (token.next != null) token = token.next; else token = token.next = token_source.getNextToken(); jj_ntk = -1; jj_gen++; return token; } final public Token getToken(int index) { Token t = lookingAhead ? jj_scanpos : token; for (int i = 0; i < index; i++) { if (t.next != null) t = t.next; else t = t.next = token_source.getNextToken(); } return t; } final private int jj_ntk() { if ((jj_nt=token.next) == null) return (jj_ntk = (token.next=token_source.getNextToken()).kind); else return (jj_ntk = jj_nt.kind); } private java.util.Vector jj_expentries = new java.util.Vector(); private int[] jj_expentry; private int jj_kind = -1; private int[] jj_lasttokens = new int[100]; private int jj_endpos; private void jj_add_error_token(int kind, int pos) { if (pos >= 100) return; if (pos == jj_endpos + 1) { jj_lasttokens[jj_endpos++] = kind; } else if (jj_endpos != 0) { jj_expentry = new int[jj_endpos]; for (int i = 0; i < jj_endpos; i++) { jj_expentry[i] = jj_lasttokens[i]; } boolean exists = false; for (java.util.Enumeration e = jj_expentries.elements(); e.hasMoreElements();) { int[] oldentry = (int[])(e.nextElement()); if (oldentry.length == jj_expentry.length) { exists = true; for (int i = 0; i < jj_expentry.length; i++) { if (oldentry[i] != jj_expentry[i]) { exists = false; break; } } if (exists) break; } } if (!exists) jj_expentries.addElement(jj_expentry); if (pos != 0) jj_lasttokens[(jj_endpos = pos) - 1] = kind; } } public ParseException generateParseException() { jj_expentries.removeAllElements(); boolean[] la1tokens = new boolean[144]; for (int i = 0; i < 144; i++) { la1tokens[i] = false; } if (jj_kind >= 0) { la1tokens[jj_kind] = true; jj_kind = -1; } for (int i = 0; i < 29; i++) { if (jj_la1[i] == jj_gen) { for (int j = 0; j < 32; j++) { if ((jj_la1_0[i] & (1<<j)) != 0) { la1tokens[j] = true; } if ((jj_la1_1[i] & (1<<j)) != 0) { la1tokens[32+j] = true; } if ((jj_la1_2[i] & (1<<j)) != 0) { la1tokens[64+j] = true; } if ((jj_la1_3[i] & (1<<j)) != 0) { la1tokens[96+j] = true; } if ((jj_la1_4[i] & (1<<j)) != 0) { la1tokens[128+j] = true; } } } } for (int i = 0; i < 144; i++) { if (la1tokens[i]) { jj_expentry = new int[1]; jj_expentry[0] = i; jj_expentries.addElement(jj_expentry); } } jj_endpos = 0; jj_rescan_token(); jj_add_error_token(0, 0); int[][] exptokseq = new int[jj_expentries.size()][]; for (int i = 0; i < jj_expentries.size(); i++) { exptokseq[i] = (int[])jj_expentries.elementAt(i); } return new ParseException(token, exptokseq, tokenImage); } final public void enable_tracing() { } final public void disable_tracing() { } final private void jj_rescan_token() { jj_rescan = true; for (int i = 0; i < 1; i++) { JJCalls p = jj_2_rtns[i]; do { if (p.gen > jj_gen) { jj_la = p.arg; jj_lastpos = jj_scanpos = p.first; switch (i) { case 0: jj_3_1(); break; } } p = p.next; } while (p != null); } jj_rescan = false; } final private void jj_save(int index, int xla) { JJCalls p = jj_2_rtns[index]; while (p.gen > jj_gen) { if (p.next == null) { p = p.next = new JJCalls(); break; } p = p.next; } p.gen = jj_gen + xla - jj_la; p.first = token; p.arg = xla; } static final class JJCalls { int gen; Token first; int arg; JJCalls next; } }