package com.ctc.wstx.dtd;
import java.util.*;
Model class that represents sequence of 2 sub-models, needed to be
matched in the order.
/**
* Model class that represents sequence of 2 sub-models, needed to be
* matched in the order.
*/
public class ConcatModel
extends ModelNode
{
ModelNode mLeftModel;
ModelNode mRightModel;
final boolean mNullable;
BitSet mFirstPos, mLastPos;
/*
///////////////////////////////////////////////////
// Life-cycle
///////////////////////////////////////////////////
*/
public ConcatModel(ModelNode left, ModelNode right)
{
super();
mLeftModel = left;
mRightModel = right;
mNullable = mLeftModel.isNullable() && mRightModel.isNullable();
}
/*
///////////////////////////////////////////////////
// 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 ConcatModel(mLeftModel.cloneModel(), mRightModel.cloneModel());
}
@Override
public boolean isNullable() {
return mNullable;
}
@Override
public void indexTokens(List<TokenModel> tokens)
{
mLeftModel.indexTokens(tokens);
mRightModel.indexTokens(tokens);
}
@Override
public void addFirstPos(BitSet pos) {
if (mFirstPos == null) {
mFirstPos = new BitSet();
mLeftModel.addFirstPos(mFirstPos);
if (mLeftModel.isNullable()) {
mRightModel.addFirstPos(mFirstPos);
}
}
pos.or(mFirstPos);
}
@Override
public void addLastPos(BitSet pos) {
if (mLastPos == null) {
mLastPos = new BitSet();
mRightModel.addLastPos(mLastPos);
if (mRightModel.isNullable()) {
mLeftModel.addLastPos(mLastPos);
}
}
pos.or(mLastPos);
}
@Override
public void calcFollowPos(BitSet[] followPosSets)
{
// Let's let sub-models do what they need to do
mLeftModel.calcFollowPos(followPosSets);
mRightModel.calcFollowPos(followPosSets);
/* And then we can calculate follower sets between left and
* right sub models; so that left model's last position entries
* have right model's first position entries included
*/
BitSet foll = new BitSet();
mRightModel.addFirstPos(foll);
BitSet toAddTo = new BitSet();
mLeftModel.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()
{
StringBuilder sb = new StringBuilder();
sb.append('(');
sb.append(mLeftModel.toString());
sb.append(", ");
sb.append(mRightModel.toString());
sb.append(')');
return sb.toString();
}
}