/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package pl.edu.amu.wmi.daut.base; import java.util.SortedSet; import java.util.TreeSet; /** * ComplementCharClassTransitionLabel jest implementacją TransitionLabel * reprezentującą przejście po znaku z dopełnienia podanej klasy znaków. * */ public class ComplementCharClassTransitionLabel extends TransitionLabel { /** * * @param s Przyjmuje Stringa będącego wyrażeniem regularnym */ public ComplementCharClassTransitionLabel(String s) { int l = s.length(); se = new TreeSet<Character>(); for (int i = 0; i < l; i++) { if (s.charAt(i) == '-') { if (i == 0 || i == l - 1) { se.add('-'); } else { for (char k = (char) (s.charAt(i - 1) + 1); k < (s.charAt(i + 1)); k++) { se.add(k); } } } else { se.add(s.charAt(i)); } } } /** * * @return Wynikiem jest wartość logiczna odpowiadająca na pytanie czy może * być epsilon przejście */ @Override public boolean canBeEpsilon() { return false; } /** * * @param c Przyjmuje znak do sprawdzenia * @return Wynikiem jest wartość logiczna czy znak jest akceptowany */ @Override public boolean canAcceptCharacter(char c) { return !(se.contains(c)); } /** * * @return Zwraca wartość logiczną czy jest puste przejście */ @Override public boolean isEmpty() { return false; } /** * * @param label Przyjmuje TransitionLabel * @return Zwraca etykietę przejścia będącą przecięciem label i danej * etykiety */ @Override protected TransitionLabel intersectWith(TransitionLabel label) { if (label instanceof ComplementCharClassTransitionLabel) { return new ComplementCharClassTransitionLabel( getIntersectionString((ComplementCharClassTransitionLabel) label)); } else { throw new CannotDetermineIntersectionException(); } } /** * * @return Zwraca set przechowujący spełniające podane wyrażenie regularne */ protected SortedSet<Character> getSet() { return se; } /** * * @return Zwraca String będący przecięciem dwóch obiektów * ComplementCharclassTransitionLabel */ private String getIntersectionString(ComplementCharClassTransitionLabel label) { SortedSet<Character> set = new TreeSet<Character>(), set1; set1 = ((ComplementCharClassTransitionLabel) label).getSet(); for (Character o : se) { set.add(o); } for (Character o : set1) { set.add(o); } StringBuilder buf = new StringBuilder(); boolean f = false; for (Character o : set) { if (o.equals('-')) { f = true; continue; } buf.append(o); } if (f) { buf.append('-'); } String str = buf.toString(); char p = 0, k = 0; if (str.length() == 0) { return ""; } StringBuilder n = new StringBuilder(); p = str.charAt(0); k = p; for (int i = 1; i < str.length(); i++) { if (k + 1 != str.charAt(i)) { if (p != k) { n.append(p); n.append('-'); n.append(k); } else { n.append(p); } p = str.charAt(i); k = p; } else { k++; } } if (p != k) { n.append(p); n.append('-'); n.append(k); } else { n.append(p); } return n.toString(); } /** * * @return Zwraca wyrażenie regularne */ @Override public String toString() { String q = ""; q += "[^"; q += getIntersectionString(new ComplementCharClassTransitionLabel("")); q += "]"; return q; } private SortedSet<Character> se; }