in jflex/src/main/java/jflex/core/RegExp.java [168:227]
public final RegExp resolveTilde() {
RegExp1 unary;
RegExp2 binary;
RegExp content;
switch (type) {
case sym.BAR:
binary = (RegExp2) this;
return new RegExp2(sym.BAR, binary.r1.resolveTilde(), binary.r2.resolveTilde());
case sym.CONCAT:
binary = (RegExp2) this;
return new RegExp2(sym.CONCAT, binary.r1.resolveTilde(), binary.r2.resolveTilde());
case sym.STAR:
unary = (RegExp1) this;
content = (RegExp) unary.content;
return new RegExp1(sym.STAR, content.resolveTilde());
case sym.PLUS:
unary = (RegExp1) this;
content = (RegExp) unary.content;
return new RegExp1(sym.PLUS, content.resolveTilde());
case sym.QUESTION:
unary = (RegExp1) this;
content = (RegExp) unary.content;
return new RegExp1(sym.QUESTION, content.resolveTilde());
case sym.BANG:
unary = (RegExp1) this;
content = (RegExp) unary.content;
return new RegExp1(sym.BANG, content.resolveTilde());
case sym.TILDE:
// ~a = !([^]* a [^]*) a
// uses subexpression sharing
unary = (RegExp1) this;
content = ((RegExp) unary.content).resolveTilde();
RegExp any_star = new RegExp1(sym.STAR, anyChar());
RegExp neg =
new RegExp1(
sym.BANG,
new RegExp2(sym.CONCAT, any_star, new RegExp2(sym.CONCAT, content, any_star)));
return new RegExp2(sym.CONCAT, neg, content);
case sym.STRING:
case sym.STRING_I:
case sym.CHAR:
case sym.CHAR_I:
case sym.PRIMCLASS:
unary = (RegExp1) this;
return new RegExp1(unary.type, unary.content);
default:
throw new RegExpException(this);
}
}