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;
/**
*
* Obsługa wyjątków.
*/
class InvalidEscapeOperatorException extends RuntimeException {
public InvalidEscapeOperatorException(String message) {
super(message);
}
}
/**
*
* Klasa EscapeOperator reprezentująca znak poprzedzony znakiem ucieczki
* (w wyrażeniach regularnych POSIX - odwrócony ukośnik).
*/
public class EscapeOperator extends NullaryRegexpOperator {
private char znak;
@Override
public AutomatonSpecification createFixedAutomaton() {
return new NaiveAutomatonSpecification().makeOneTransitionAutomaton(translate());
}
/**
* Konstruktor klasy.
* @param a znak poprzedzony symbolem ucieczki
*/
public EscapeOperator(char a) {
this.setChar(a);
}
private void setChar(char b) {
this.znak = b;
}
private char translate() {
switch (znak) {
case 'n':
return ('\n');
case 't':
return ('\t');
case 'a':
return ('\7');
case 'f':
return ('\f');
case 'r':
return ('\r');
case 'v':
return ('\13');
default:
return znak;
}
}
/**
* Fabryka operatora.
*/
public static class Factory extends NullaryRegexpOperatorFactory {
@Override
public int numberOfParams() {
return 1;
}
@Override
protected RegexpOperator doCreateOperator(List<String> params) {
if (params.get(0).length() == 1)
return new EscapeOperator(params.get(0).charAt(0));
else
throw new InvalidEscapeOperatorException("Argument was "
+ "supposed to be a char, not a string");
}
}
}