package pl.edu.amu.wmi.daut.base; import java.util.SortedSet; import java.util.TreeSet; /** * Klasa służy obsłudze prostych klas wyrażeń regularnych, * pozwala na sprawdzenie czy dany znak je spełnia. */ public class CharClassTransitionLabel extends TransitionLabel { private SortedSet<Character> ssc = new TreeSet<Character>(); private String charClass; /** * poniższy konstruktor przekształca dany łańcuch na zbiór charów. * @param s jest zbiorem klas wyrażeń regularnych do których należy dany char */ public CharClassTransitionLabel(String s) { charClass = s; if (s.charAt(0) == '-' || s.charAt(s.length() - 1) == '-') { addChar(s.charAt(0)); } for (int i = 0; i < s.length(); ++i) { if (i + 2 < s.length() && s.charAt(i + 1) == '-') { addChar(s.charAt(i), s.charAt(i + 2)); i += 2; } else { addChar(s.charAt(i)); } } } private void addChar(Character c1, Character c2) { for (Character d = c1; d <= c2; ++d) { ssc.add(d); } } private void addChar(Character c) { ssc.add(c); } @Override public boolean canBeEpsilon() { return false; } @Override public boolean canAcceptCharacter(final char c) { return ssc.contains((Character) c); } @Override public boolean isEmpty() { return charClass.isEmpty(); } @Override public String toString() { return "[" + charClass + "]"; } @Override protected TransitionLabel intersectWith(TransitionLabel label) { SortedSet<Character> tmp = new TreeSet<Character>(); StringBuilder sb = new StringBuilder(); for (Character c : ssc) { if (label.canAcceptCharacter(c)) { tmp.add(c); } } for (Character c : tmp) { sb.append(c); } return new CharClassTransitionLabel(sb.toString()); } }