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.State; import java.util.List; /** * Klasa reprezentującą operator '{n}' z wyrażeń regularnych. */ public class FixedNumberOfOccurrencesOperator extends UnaryRegexpOperator { private int numberOfOccurrences; /** * Konstruktor klasy. */ public FixedNumberOfOccurrencesOperator(int a) { numberOfOccurrences = a; } /** * Główna metoda klasy. */ public AutomatonSpecification createAutomatonFromOneAutomaton( AutomatonSpecification subautomaton) { AutomatonSpecification automatbudowany = new NaiveAutomatonSpecification(); if (numberOfOccurrences == 0) { State state = automatbudowany.addState(); automatbudowany.markAsInitial(state); automatbudowany.markAsFinal(state); } if (numberOfOccurrences > 0) { automatbudowany = subautomaton.clone(); for (int i = 1; i < numberOfOccurrences; i++) { State newState = automatbudowany.addState(); for (State state : automatbudowany.allStates()) { if (automatbudowany.isFinal(state)) { automatbudowany.addTransition(state, newState, new EpsilonTransitionLabel()); automatbudowany.unmarkAsFinalState(state); } } automatbudowany.insert(newState, subautomaton); } } return automatbudowany; } /** * Fabryka operatora. */ public static class Factory extends UnaryRegexpOperatorFactory { @Override public int numberOfParams() { return 1; } protected RegexpOperator doCreateOperator(List<String> params) { return new FixedNumberOfOccurrencesOperator(Integer.parseInt(params.get(0))); } } /** * Metoda toString(). */ @Override public String toString() { return "FIXED_" + numberOfOccurrences + "_TIMES"; } }