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";
}
}