package pl.edu.amu.wmi.daut.re;
import java.util.List;
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.State;
/**
* Klasa reprezentujÄ…ca operator '{n,m}'.
*/
public class RangeNumberOfOccurrencesOperator extends UnaryRegexpOperator {
/**
* Zmienne dla ilosci wystapen wyrazenia.
*/
private int max;
private int min;
/**
* Konstruktor klasy.
*/
public RangeNumberOfOccurrencesOperator(int n, int m) {
this.max = m;
this.min = n;
}
/**
* Glowna metoda klasy.
*/
public AutomatonSpecification createAutomatonFromOneAutomaton(
AutomatonSpecification subautomaton) {
AutomatonSpecification finalAutomaton = new NaiveAutomatonSpecification();
if (this.min > this.max) {
return finalAutomaton;
} else {
finalAutomaton = subautomaton.clone();
if (this.min == 0) {
finalAutomaton.markAsFinal(finalAutomaton.getInitialState());
if (this.max == 0) {
for (State state : finalAutomaton.allStates()) {
finalAutomaton.unmarkAsFinalState(state);
}
finalAutomaton.markAsFinal(finalAutomaton.getInitialState());
}
}
for (int i = 1; i < this.max; i++) {
State newState = finalAutomaton.addState();
for (State state : finalAutomaton.allStates()) {
if (finalAutomaton.isFinal(state)) {
finalAutomaton.addTransition(state, newState, new EpsilonTransitionLabel());
if (i < this.min)
finalAutomaton.unmarkAsFinalState(state);
}
}
finalAutomaton.insert(newState, subautomaton);
}
}
return finalAutomaton;
}
/**
* Fabryka operatora.
*/
public static class Factory extends UnaryRegexpOperatorFactory {
@Override
public int numberOfParams() {
return 2;
}
protected RegexpOperator doCreateOperator(List<String> params) {
return new RangeNumberOfOccurrencesOperator(Integer.parseInt(params.get(0)),
Integer.parseInt(params.get(1)));
}
}
/**
* Metoda toString().
*/
@Override
public String toString() {
return "RANGE_NUMBER_OF_OCCURRENCES_FROM_" + min + "_TO_" + max;
}
};