package parsing;
import java.util.Stack;
import org.antlr.v4.runtime.BufferedTokenStream;
import org.antlr.v4.runtime.Token;
import org.antlr.v4.runtime.TokenSource;
public class TokenSubStream extends BufferedTokenStream
{
protected int stopIndex = -1;
protected int startIndex = 0;
protected Stack<Integer> stopIndexStack = new Stack<Integer>();
protected Stack<Integer> startIndexStack = new Stack<Integer>();
public TokenSubStream(TokenSource tokenSource)
{
super(tokenSource);
}
public void restrict(int aStartIndex, int aStopIndex)
{
startIndexStack.push(index());
stopIndexStack.push(stopIndex);
startIndex = aStartIndex;
stopIndex = aStopIndex;
seek(aStartIndex);
}
public void resetRestriction()
{
stopIndex = stopIndexStack.pop();
startIndex = startIndexStack.pop();
seek(startIndex);
}
@Override
public void reset()
{
seek(startIndex);
}
@Override
public Token LT(int k)
{
lazyInit();
if (k == 0)
return null;
if (k < 0)
return LB(-k);
int i = p + k - 1;
sync(i);
if (i >= tokens.size() || (stopIndex != -1 && i >= stopIndex))
{ // return EOF token
// EOF must be last token
return (Token) tokens.get(tokens.size() - 1);
}
return (Token) tokens.get(i);
}
}