|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object com.saxonica.schema.fsa.FiniteStateMachine
public class FiniteStateMachine
Class representing a finite state machine, as a collection of states with transitions between them. The finite state machine allows states with counters. The static machine created by the schema compiler contains states of type AutomatonState; these may have a minOccurs and maxOccurs value. When such a state is entered at validation time, a CountingState is dynamically created that contains a pointer to the fixed AutomatonState plus an integer counter. Any transition that goes from the state to itself causes a new CountingState to be created with an incremented value of the counter (provided it does not exceed the maxOccurs()); any transition to a different state causes the counter to be checked against the minOccurs value.
Nested Class Summary | |
---|---|
protected static class |
FiniteStateMachine.TermParticlePair
|
Constructor Summary | |
---|---|
FiniteStateMachine(UserComplexType type,
boolean determinized)
Create a finite state machine |
Method Summary | |
---|---|
void |
allocateStateNumber(AutomatonState state)
Allocate a unique number to a state, and index the state from the FSM |
static NonDeterminizedState |
compileParticle(SchemaCompiler compiler,
Particle particle,
NonDeterminizedState endState,
UserComplexType subjectType,
FiniteStateMachine machine)
Static method to translate a particle to a Finite State Automaton, returning the start state of the FSA. |
static FiniteStateMachine |
determinize(SchemaCompiler compiler,
FiniteStateMachine nfsa)
Determinize the finite state machine: that is, ensure that there are no ambiguous transitions from this state. |
void |
display(PrintStream err)
Display the finite state machine. |
AutomatonState |
getInitialState()
Get the initial state of this finite state machine |
int |
getNumberOfStates()
Determine the number of states in this finite state machine |
Wildcard |
getOpenContentWildcard()
Get the open content wildcard, if any |
AutomatonState |
getState(int number)
Get the state with a given unique state number |
boolean |
isOpenContentInterleaved()
Ask whether the open content wildcard for this finite state machine (assuming there is one) permits interleaved content (as opposed to suffixed content only) |
void |
serialize(SchemaModelSerializer serializer)
Output a reppresentation of this finite state machine |
void |
setInitialState(AutomatonState initialState)
Set the initial state of this finite state machine |
void |
setOpenContentWildcard(Wildcard wildcard,
boolean interleaved)
Set the open content wildcard for this machine |
static String |
subsumesMachine(FiniteStateMachine base,
FiniteStateMachine sub,
SchemaCompiler compiler)
Test whether one finite state machine subsumes another FSM: that is, whether for each path through the second FSM, there is a corresponding path through the first FSM. |
Methods inherited from class java.lang.Object |
---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Constructor Detail |
---|
public FiniteStateMachine(UserComplexType type, boolean determinized)
type
- the type whose content model is implemented by this finite state machinedeterminized
- true if this machine is determinizedMethod Detail |
---|
public void allocateStateNumber(AutomatonState state)
state
- the state whose number is to be allocatedpublic int getNumberOfStates()
public AutomatonState getInitialState()
public void setInitialState(AutomatonState initialState)
initialState
- the initial statepublic AutomatonState getState(int number)
number
- the number of the state
public void setOpenContentWildcard(Wildcard wildcard, boolean interleaved)
wildcard
- the open content wildcard (may be null)interleaved
- true if open content may be interleaved, false if it must be suffixedpublic static NonDeterminizedState compileParticle(SchemaCompiler compiler, Particle particle, NonDeterminizedState endState, UserComplexType subjectType, FiniteStateMachine machine) throws SchemaException, UnresolvedReferenceException
compiler
- user for error reportingparticle
- the particle to be compiled, which is either an ElementDeclaration,
a WildCard, a choice, or a sequenceendState
- the State representing the final state of the automatonsubjectType
- the complex type to which this particle belongsmachine
- the finite state machine to which the state belongs
SchemaException
- if XSD constraints are violated
UnresolvedReferenceException
- if unresolved references in the schema are foundpublic void display(PrintStream err)
err
- the output destinationpublic static String subsumesMachine(FiniteStateMachine base, FiniteStateMachine sub, SchemaCompiler compiler)
base
- the first FSM (representing the base type)sub
- the other FSM (representing the type that is derived by restriction, validly or otherwise)compiler
- used for error reporting
public static FiniteStateMachine determinize(SchemaCompiler compiler, FiniteStateMachine nfsa) throws SchemaException
This is a revised implementation, based more closely on Aho and Ullman p93, to try to eliminate the rare problems that occur when a state has two transitions for the same symbol. (Given UPA, this should occur only with nested loops, e.g. (a{10,11}){1,3} which allows a sequence of 10, 20, 30, 11, 22, or 33 a's.)
compiler
- the schema compilernfsa
- the finite state machine to be determinized
SchemaException
- if an XSD constraint is violatedpublic Wildcard getOpenContentWildcard()
public boolean isOpenContentInterleaved()
public void serialize(SchemaModelSerializer serializer) throws XPathException
serializer
- the schema model serializer to which this representation is to be written
XPathException
- if any error occurs during serialization
|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |