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 }