package com.ctc.wstx.dtd;
import java.util.*;
Model class that represents any number of repetitions of its submodel
(including no repetitions).
/**
* Model class that represents any number of repetitions of its submodel
* (including no repetitions).
*/
public class StarModel
extends ModelNode
{
ModelNode mModel;
/*
///////////////////////////////////////////////////
// Life-cycle
///////////////////////////////////////////////////
*/
public StarModel(ModelNode model) {
super();
mModel = model;
}
/*
///////////////////////////////////////////////////
// Public API
///////////////////////////////////////////////////
*/
Method that has to create a deep copy of the model, without
sharing any of existing Objects.
/**
* Method that has to create a deep copy of the model, without
* sharing any of existing Objects.
*/
@Override
public ModelNode cloneModel() {
return new StarModel(mModel.cloneModel());
}
@Override
public boolean isNullable() {
return true;
}
@Override
public void indexTokens(List<TokenModel> tokens) {
mModel.indexTokens(tokens);
}
@Override
public void addFirstPos(BitSet pos) {
mModel.addFirstPos(pos);
}
@Override
public void addLastPos(BitSet pos) {
mModel.addLastPos(pos);
}
@Override
public void calcFollowPos(BitSet[] followPosSets)
{
// First, let's let sub-model do its stuff
mModel.calcFollowPos(followPosSets);
/* And then add the closure for the model (since sub-model
* can 'follow itself' as many times as it needs to)
*/
BitSet foll = new BitSet();
mModel.addFirstPos(foll);
BitSet toAddTo = new BitSet();
mModel.addLastPos(toAddTo);
int ix = 0; // need to/can skip the null entry (index 0)
while ((ix = toAddTo.nextSetBit(ix+1)) >= 0) {
/* Ok; so token at this index needs to have follow positions
* added...
*/
followPosSets[ix].or(foll);
}
}
@Override
public String toString() {
return mModel.toString() + "*";
}
}