001 package com.thaiopensource.relaxng.impl; 002 003 class EndTagDerivFunction extends AbstractPatternFunction { 004 private final ValidatorPatternBuilder builder; 005 006 EndTagDerivFunction(ValidatorPatternBuilder builder) { 007 this.builder = builder; 008 } 009 010 public Object caseOther(Pattern p) { 011 return builder.makeNotAllowed(); 012 } 013 014 public Object caseChoice(ChoicePattern p) { 015 return builder.makeChoice(memoApply(p.getOperand1()), 016 memoApply(p.getOperand2())); 017 } 018 019 public Object caseAfter(AfterPattern p) { 020 if (p.getOperand1().isNullable()) 021 return p.getOperand2(); 022 else 023 return builder.makeNotAllowed(); 024 } 025 026 final private Pattern memoApply(Pattern p) { 027 return apply(builder.getPatternMemo(p)).getPattern(); 028 } 029 030 private PatternMemo apply(PatternMemo memo) { 031 return memo.endTagDeriv(this); 032 } 033 }