/*
 * Copyright 2009-2012 by The Regents of the University of California
 * Licensed 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 from
 * 
 *     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 edu.uci.ics.asterix.lexergenerator;

import java.util.HashMap;

import edu.uci.ics.asterix.lexergenerator.rulegenerators.*;

public class NodeChainFactory {
    static private HashMap<String, RuleGenerator> ruleGenerators = new HashMap<String, RuleGenerator>();

    static {
        ruleGenerators.put("char", new RuleGeneratorChar());
        ruleGenerators.put("string", new RuleGeneratorString());
        ruleGenerators.put("anythingUntil", new RuleGeneratorAnythingUntil());
        ruleGenerators.put("signOrNothing", new RuleGeneratorSignOrNothing());
        ruleGenerators.put("sign", new RuleGeneratorSign());
        ruleGenerators.put("digitSequence", new RuleGeneratorDigitSequence());
        ruleGenerators.put("caseInsensitiveChar", new RuleGeneratorCaseInsensitiveChar());
        ruleGenerators.put("charOrNothing", new RuleGeneratorCharOrNothing());
        ruleGenerators.put("token", new RuleGeneratorToken());
        ruleGenerators.put("nothing", new RuleGeneratorNothing());
    }

    public static LexerNode create(String generator, String constructor) throws Exception {
        constructor = constructor.replace("@", "aux_");
        if (ruleGenerators.get(generator) == null)
            throw new Exception("Rule Generator not found for '" + generator + "'");
        return ruleGenerators.get(generator).generate(constructor);
    }
}
