package org.antlr.v4.codegen.model;
import org.antlr.v4.codegen.OutputModelFactory;
import org.antlr.v4.runtime.misc.IntervalSet;
import org.antlr.v4.tool.ast.GrammarAST;
import java.util.ArrayList;
import java.util.List;
public class TestSetInline extends SrcOp {
public int bitsetWordSize;
public String varName;
public Bitset[] bitsets;
public TestSetInline(OutputModelFactory factory, GrammarAST ast, IntervalSet set, int wordSize) {
super(factory, ast);
bitsetWordSize = wordSize;
Bitset[] withZeroOffset = createBitsets(factory, set, wordSize, true);
Bitset[] withoutZeroOffset = createBitsets(factory, set, wordSize, false);
this.bitsets = withZeroOffset.length <= withoutZeroOffset.length ? withZeroOffset : withoutZeroOffset;
this.varName = "_la";
}
private static Bitset[] createBitsets(OutputModelFactory factory,
IntervalSet set,
int wordSize,
boolean useZeroOffset) {
List<Bitset> bitsetList = new ArrayList<Bitset>();
for (int ttype : set.toArray()) {
Bitset current = !bitsetList.isEmpty() ? bitsetList.get(bitsetList.size() - 1) : null;
if (current == null || ttype > (current.shift + wordSize-1)) {
current = new Bitset();
if (useZeroOffset && ttype >= 0 && ttype < wordSize-1) {
current.shift = 0;
}
else {
current.shift = ttype;
}
bitsetList.add(current);
}
current.ttypes.add(factory.getGenerator().getTarget().getTokenTypeAsTargetLabel(factory.getGrammar(), ttype));
}
return bitsetList.toArray(new Bitset[bitsetList.size()]);
}
public static final class Bitset {
public int shift;
public final List<String> ttypes = new ArrayList<String>();
}
}