package com.thaiopensource.relaxng.pattern;
class EndTagDerivFunction extends AbstractPatternFunction<Pattern> {
private final ValidatorPatternBuilder builder;
EndTagDerivFunction(ValidatorPatternBuilder builder) {
this.builder = builder;
}
public Pattern caseOther(Pattern p) {
return builder.makeNotAllowed();
}
public Pattern caseChoice(ChoicePattern p) {
return builder.makeChoice(memoApply(p.getOperand1()),
memoApply(p.getOperand2()));
}
public Pattern caseAfter(AfterPattern p) {
if (p.getOperand1().isNullable())
return p.getOperand2();
else
return builder.makeNotAllowed();
}
private Pattern memoApply(Pattern p) {
return apply(builder.getPatternMemo(p)).getPattern();
}
private PatternMemo apply(PatternMemo memo) {
return memo.endTagDeriv(this);
}
}