/*
* @(#)$Id: ContentModelAcceptor.java,v 1.6 2001/08/08 19:42:38 Bear Exp $
*
* Copyright 2001 Sun Microsystems, Inc. All Rights Reserved.
*
* This software is the proprietary information of Sun Microsystems, Inc.
* Use is subject to license terms.
*
*/
package com.sun.msv.verifier.regexp;
import com.sun.msv.grammar.Expression;
import com.sun.msv.grammar.ElementExp;
import com.sun.msv.verifier.*;
import com.sun.msv.verifier.regexp.ExpressionAcceptor;
import com.sun.msv.verifier.regexp.ElementToken;
import com.sun.msv.verifier.regexp.CombinedChildContentExpCreator;
import com.sun.msv.util.StartTagInfo;
import com.sun.msv.util.StringRef;
import java.util.Set;
import java.util.List;
import java.util.Iterator;
/**
* base implementation for SimpleAcceptor and ComplexAcceptor
*
* @author <a href="mailto:kohsuke.kawaguchi@eng.sun.com">Kohsuke KAWAGUCHI</a>
*/
public abstract class ContentModelAcceptor extends ExpressionAcceptor {
protected ContentModelAcceptor(
REDocumentDeclaration docDecl, Expression exp,
boolean ignoreUndeclaredAttributes ) {
super(docDecl,exp,ignoreUndeclaredAttributes);
}
public boolean stepForward( Acceptor child, StringRef errRef ) {
// TODO: explicitly mention that where the error recovery should be done.
if( child instanceof SimpleAcceptor ) {
SimpleAcceptor sa = (SimpleAcceptor)child;
if(sa.continuation!=null)
// if the continuation is available,
// the stepForward will be very fast.
return stepForwardByContinuation( sa.continuation, errRef );
else
// otherwise we have to compute the residual.
return stepForward( new ElementToken(new ElementExp[]{sa.owner}), errRef );
}
if( child instanceof ComplexAcceptor ) {
ComplexAcceptor ca = (ComplexAcceptor)child;
return stepForward(
new ElementToken(
(errRef!=null)?
ca.owners: // in error recovery mode, pretend that every owner is happy.
ca.getSatisfiedOwners() ),
errRef);
}
throw new Error(); // child must be either Simple or Complex.
}
/**
* creates actual Acceptor object from the computed result.
*/
protected Acceptor createAcceptor(
Expression combined, Expression continuation,
ElementExp[] primitives, int numPrimitives ) {
if( primitives==null || numPrimitives<=1 ) {
// primitives==null is possible when recovering from error.
// in this special case, combined child pattern and primitive patterns are the same.
// therefore we don't need to keep track of primitive patterns.
return new SimpleAcceptor(
docDecl, combined,
(primitives==null)?null:primitives[0],
continuation );
}
// TODO: implements MultipleAcceptor for cases that
// combined expression is unnecessary but there are more than one primitive.
if( com.sun.msv.driver.textui.Debug.debug )
System.out.println("ComplexAcceptor is used");
// we need a fresh array.
ElementExp[] owners = new ElementExp[numPrimitives];
System.arraycopy( primitives, 0, owners, 0, numPrimitives );
return new ComplexAcceptor( docDecl, combined, owners );
}
// ContentModelAcceptor does not support type-assignment.
// This will be supported by SimpleAcceptor only.
public Object getOwnerType() { return null; }
}