001 package com.thaiopensource.relaxng.impl; 002 003 class MixedTextDerivFunction extends EndAttributesFunction { 004 005 MixedTextDerivFunction(ValidatorPatternBuilder builder) { 006 super(builder); 007 } 008 009 public Object caseText(TextPattern p) { 010 return p; 011 } 012 013 public Object caseGroup(GroupPattern p) { 014 final Pattern p1 = p.getOperand1(); 015 final Pattern p2 = p.getOperand2(); 016 final Pattern q1 = memoApply(p1); 017 Pattern tem = (q1 == p1) ? p : getPatternBuilder().makeGroup(q1, p2); 018 if (!p1.isNullable()) 019 return tem; 020 return getPatternBuilder().makeChoice(tem, memoApply(p2)); 021 } 022 023 public Object caseInterleave(InterleavePattern p) { 024 final Pattern p1 = p.getOperand1(); 025 final Pattern p2 = p.getOperand2(); 026 final Pattern q1 = memoApply(p1); 027 final Pattern q2 = memoApply(p2); 028 final Pattern i1 = (q1 == p1) ? p : getPatternBuilder().makeInterleave(q1, p2); 029 final Pattern i2 = (q2 == p2) ? p : getPatternBuilder().makeInterleave(p1, q2); 030 return getPatternBuilder().makeChoice(i1, i2); 031 } 032 033 public Object caseOneOrMore(OneOrMorePattern p) { 034 return getPatternBuilder().makeGroup(memoApply(p.getOperand()), 035 getPatternBuilder().makeOptional(p)); 036 } 037 038 public Object caseOther(Pattern p) { 039 return getPatternBuilder().makeNotAllowed(); 040 } 041 042 PatternMemo apply(PatternMemo memo) { 043 return memo.mixedTextDeriv(this); 044 } 045 }