Package pl.edu.amu.wmi.daut.re

Source Code of pl.edu.amu.wmi.daut.re.AnyOrderOperator$Factory

package pl.edu.amu.wmi.daut.re;

import pl.edu.amu.wmi.daut.base.AutomatonSpecification;
import pl.edu.amu.wmi.daut.base.NaiveAutomatonSpecification;
import pl.edu.amu.wmi.daut.base.EpsilonTransitionLabel;
import pl.edu.amu.wmi.daut.base.AutomataOperations;
import pl.edu.amu.wmi.daut.base.State;
import java.util.List;

/**
* Klasa reprezentujaca operator oznaczajacy, ze dwa elementy moga wystapic jeden po drugim
* w dowolnej kolejnosci.
*/
public class AnyOrderOperator extends BinaryRegexpOperator {

    @Override
    public AutomatonSpecification createAutomatonFromTwoAutomata(
            AutomatonSpecification leftSubautomaton, AutomatonSpecification rightSubautomaton) {

        AutomatonSpecification automatonLR = new NaiveAutomatonSpecification();
        AutomatonSpecification automatonRL = new NaiveAutomatonSpecification();

        concatenate(leftSubautomaton, rightSubautomaton, automatonLR);
        concatenate(rightSubautomaton, leftSubautomaton, automatonRL);

        return AutomataOperations.sum(automatonLR, automatonRL);
    }

    /**
     * @param first
     * Automat poczatkowy, ktory rozpoczyna wyjsciowy automat.
     * @param second
     * Automat ktory jest 'doklejany' do stanow koncowych poczatkowego automatu.
     * @param automaton
     * Pusty automat ktory ma byc konkatenacja pierwszych 2 automatow.
     */
    private void concatenate(AutomatonSpecification first,
            AutomatonSpecification second, AutomatonSpecification automaton) {

        State initialStateL = automaton.addState();
        State finalStateL = automaton.addState();
        automaton.markAsInitial(initialStateL);
        automaton.insert(initialStateL, first);
        for (State q : automaton.allStates()) {
            if (automaton.isFinal(q)) {
               automaton.addTransition(q, finalStateL, new EpsilonTransitionLabel());
               automaton.unmarkAsFinalState(q);
            }
        }
        automaton.insert(finalStateL, second);
    }
     /**
      * Fabryka operatora.
      */
    public static class Factory extends BinaryRegexpOperatorFactory {

        @Override
        public int numberOfParams() {
            return 0;
        }

        protected RegexpOperator doCreateOperator(List<String> params) {
            return new AnyOrderOperator();
        }
    }

    /**
     * Metoda toString().
     */
    @Override
    public String toString() {
        return "ANY_ORDER";
    }

}
TOP

Related Classes of pl.edu.amu.wmi.daut.re.AnyOrderOperator$Factory

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.