Class BufferedTokenStream
- java.lang.Object
-
- org.antlr.v4.runtime.BufferedTokenStream
-
- All Implemented Interfaces:
IntStream
,TokenStream
- Direct Known Subclasses:
CommonTokenStream
public class BufferedTokenStream extends Object implements TokenStream
This implementation ofTokenStream
loads tokens from aTokenSource
on-demand, and places the tokens in a buffer to provide access to any previous token by index.This token stream ignores the value of
Token.getChannel()
. If your parser requires the token stream filter tokens to only those on a particular channel, such asToken.DEFAULT_CHANNEL
orToken.HIDDEN_CHANNEL
, use a filtering token stream such aCommonTokenStream
.
-
-
Field Summary
Fields Modifier and Type Field Description protected boolean
fetchedEOF
protected int
p
protected List<Token>
tokens
A collection of all tokens fetched from the token source.protected TokenSource
tokenSource
TheTokenSource
from which tokens for this stream are fetched.-
Fields inherited from interface org.antlr.v4.runtime.IntStream
EOF, UNKNOWN_SOURCE_NAME
-
-
Constructor Summary
Constructors Constructor Description BufferedTokenStream(TokenSource tokenSource)
-
Method Summary
All Methods Instance Methods Concrete Methods Deprecated Methods Modifier and Type Method Description protected int
adjustSeekIndex(int i)
Allowed derived classes to modify the behavior of operations which change the current stream position by adjusting the target token index of a seek operation.void
consume()
Consumes the current symbol in the stream.protected int
fetch(int n)
Addn
elements to buffer.void
fill()
Get all tokens from lexer until EOFprotected List<Token>
filterForChannel(int from, int to, int channel)
Token
get(int i)
Gets theToken
at the specifiedindex
in the stream.List<Token>
get(int start, int stop)
Get all tokens from start..stop inclusivelyList<Token>
getHiddenTokensToLeft(int tokenIndex)
Collect all hidden tokens (any off-default channel) to the left of the current token up until we see a token on DEFAULT_TOKEN_CHANNEL.List<Token>
getHiddenTokensToLeft(int tokenIndex, int channel)
Collect all tokens on specified channel to the left of the current token up until we see a token on DEFAULT_TOKEN_CHANNEL.List<Token>
getHiddenTokensToRight(int tokenIndex)
Collect all hidden tokens (any off-default channel) to the right of the current token up until we see a token on DEFAULT_TOKEN_CHANNEL or EOF.List<Token>
getHiddenTokensToRight(int tokenIndex, int channel)
Collect all tokens on specified channel to the right of the current token up until we see a token on DEFAULT_TOKEN_CHANNEL or EOF.String
getSourceName()
Gets the name of the underlying symbol source.String
getText()
Get the text of all tokens in this buffer.String
getText(Interval interval)
Return the text of all tokens within the specifiedinterval
.String
getText(RuleContext ctx)
Return the text of all tokens in the source interval of the specified context.String
getText(Token start, Token stop)
Return the text of all tokens in this stream betweenstart
andstop
(inclusive).List<Token>
getTokens()
List<Token>
getTokens(int start, int stop)
List<Token>
getTokens(int start, int stop, int ttype)
List<Token>
getTokens(int start, int stop, Set<Integer> types)
Given a start and stop index, return a List of all tokens in the token type BitSet.TokenSource
getTokenSource()
Gets the underlyingTokenSource
which provides tokens for this stream.int
index()
Return the index into the stream of the input symbol referred to byLA(1)
.int
LA(int i)
Gets the value of the symbol at offseti
from the current position.protected void
lazyInit()
protected Token
LB(int k)
Token
LT(int k)
int
mark()
protected int
nextTokenOnChannel(int i, int channel)
Given a starting index, return the index of the next token on channel.protected int
previousTokenOnChannel(int i, int channel)
Given a starting index, return the index of the previous token on channel.void
release(int marker)
This method releases a marked range created by a call tomark()
.void
reset()
Deprecated.Useseek(0)
instead.void
seek(int index)
Set the input cursor to the position indicated byindex
.void
setTokenSource(TokenSource tokenSource)
Reset this token stream by setting its token source.protected void
setup()
int
size()
Returns the total number of symbols in the stream, including a single EOF symbol.protected boolean
sync(int i)
Make sure indexi
in tokens has a token.
-
-
-
Field Detail
-
tokenSource
protected TokenSource tokenSource
TheTokenSource
from which tokens for this stream are fetched.
-
tokens
protected List<Token> tokens
A collection of all tokens fetched from the token source. The list is considered a complete view of the input oncefetchedEOF
is set totrue
.
-
p
protected int p
The index intotokens
of the current token (next token toconsume()
).tokens
[
p
]
should beLT(1)
.This field is set to -1 when the stream is first constructed or when
setTokenSource(org.antlr.v4.runtime.TokenSource)
is called, indicating that the first token has not yet been fetched from the token source. For additional information, see the documentation ofIntStream
for a description of Initializing Methods.
-
fetchedEOF
protected boolean fetchedEOF
Indicates whether theToken.EOF
token has been fetched fromtokenSource
and added totokens
. This field improves performance for the following cases:consume()
: The lookahead check inconsume()
to prevent consuming the EOF symbol is optimized by checking the values offetchedEOF
andp
instead of callingLA(int)
.fetch(int)
: The check to prevent adding multiple EOF symbols intotokens
is trivial with this field.
-
-
Constructor Detail
-
BufferedTokenStream
public BufferedTokenStream(TokenSource tokenSource)
-
-
Method Detail
-
getTokenSource
public TokenSource getTokenSource()
Description copied from interface:TokenStream
Gets the underlyingTokenSource
which provides tokens for this stream.- Specified by:
getTokenSource
in interfaceTokenStream
-
index
public int index()
Description copied from interface:IntStream
Return the index into the stream of the input symbol referred to byLA(1)
.The behavior of this method is unspecified if no call to an
initializing method
has occurred after this stream was constructed.
-
mark
public int mark()
Description copied from interface:IntStream
A mark provides a guarantee thatseek()
operations will be valid over a "marked range" extending from the index wheremark()
was called to the currentindex()
. This allows the use of streaming input sources by specifying the minimum buffering requirements to support arbitrary lookahead during prediction.The returned mark is an opaque handle (type
int
) which is passed torelease()
when the guarantees provided by the marked range are no longer necessary. When calls tomark()
/release()
are nested, the marks must be released in reverse order of which they were obtained. Since marked regions are used during performance-critical sections of prediction, the specific behavior of invalid usage is unspecified (i.e. a mark is not released, or a mark is released twice, or marks are not released in reverse order from which they were created).The behavior of this method is unspecified if no call to an
initializing method
has occurred after this stream was constructed.This method does not change the current position in the input stream.
The following example shows the use of
mark()
,release(mark)
,index()
, andseek(index)
as part of an operation to safely work within a marked region, then restore the stream position to its original value and release the mark.IntStream stream = ...; int index = -1; int mark = stream.mark(); try { index = stream.index(); // perform work here... } finally { if (index != -1) { stream.seek(index); } stream.release(mark); }
-
release
public void release(int marker)
Description copied from interface:IntStream
This method releases a marked range created by a call tomark()
. Calls torelease()
must appear in the reverse order of the corresponding calls tomark()
. If a mark is released twice, or if marks are not released in reverse order of the corresponding calls tomark()
, the behavior is unspecified.For more information and an example, see
IntStream.mark()
.- Specified by:
release
in interfaceIntStream
- Parameters:
marker
- A marker returned by a call tomark()
.- See Also:
IntStream.mark()
-
reset
@Deprecated public void reset()
Deprecated.Useseek(0)
instead.This method resets the token stream back to the first token in the buffer. It is equivalent to callingseek(int)
(0)
.- See Also:
setTokenSource(TokenSource)
-
seek
public void seek(int index)
Description copied from interface:IntStream
Set the input cursor to the position indicated byindex
. If the specified index lies past the end of the stream, the operation behaves as thoughindex
was the index of the EOF symbol. After this method returns without throwing an exception, then at least one of the following will be true.index()
will return the index of the first symbol appearing at or after the specifiedindex
. Specifically, implementations which filter their sources should automatically adjustindex
forward the minimum amount required for the operation to target a non-ignored symbol.LA(1)
returnsIntStream.EOF
index
lies within a marked region. For more information on marked regions, seeIntStream.mark()
. The behavior of this method is unspecified if no call to aninitializing method
has occurred after this stream was constructed.
-
size
public int size()
Description copied from interface:IntStream
Returns the total number of symbols in the stream, including a single EOF symbol.
-
consume
public void consume()
Description copied from interface:IntStream
Consumes the current symbol in the stream. This method has the following effects:- Forward movement: The value of
index()
before calling this method is less than the value ofindex()
after calling this method. - Ordered lookahead: The value of
LA(1)
before calling this method becomes the value ofLA(-1)
after calling this method.
index()
is incremented by exactly 1, as that would preclude the ability to implement filtering streams (e.g.CommonTokenStream
which distinguishes between "on-channel" and "off-channel" tokens). - Forward movement: The value of
-
sync
protected boolean sync(int i)
Make sure indexi
in tokens has a token.- Returns:
true
if a token is located at indexi
, otherwisefalse
.- See Also:
get(int i)
-
fetch
protected int fetch(int n)
Addn
elements to buffer.- Returns:
- The actual number of elements added to the buffer.
-
get
public Token get(int i)
Description copied from interface:TokenStream
Gets theToken
at the specifiedindex
in the stream. When the preconditions of this method are met, the return value is non-null.The preconditions for this method are the same as the preconditions of
IntStream.seek(int)
. If the behavior ofseek(index)
is unspecified for the current state and givenindex
, then the behavior of this method is also unspecified.The symbol referred to by
index
differs fromseek()
only in the case of filtering streams whereindex
lies before the end of the stream. Unlikeseek()
, this method does not adjustindex
to point to a non-ignored symbol.- Specified by:
get
in interfaceTokenStream
-
LA
public int LA(int i)
Description copied from interface:IntStream
Gets the value of the symbol at offseti
from the current position. Wheni==1
, this method returns the value of the current symbol in the stream (which is the next symbol to be consumed). Wheni==-1
, this method returns the value of the previously read symbol in the stream. It is not valid to call this method withi==0
, but the specific behavior is unspecified because this method is frequently called from performance-critical code.This method is guaranteed to succeed if any of the following are true:
i>0
i==-1
andindex()
returns a value greater than the value ofindex()
after the stream was constructed andLA(1)
was called in that order. Specifying the currentindex()
relative to the index after the stream was created allows for filtering implementations that do not return every symbol from the underlying source. Specifying the call toLA(1)
allows for lazily initialized streams.LA(i)
refers to a symbol consumed within a marked region that has not yet been released.
If
i
represents a position at or beyond the end of the stream, this method returnsIntStream.EOF
.The return value is unspecified if
i<0
and fewer than-i
calls toconsume()
have occurred from the beginning of the stream before calling this method.
-
LB
protected Token LB(int k)
-
LT
public Token LT(int k)
Description copied from interface:TokenStream
Get theToken
instance associated with the value returned byLA(k)
. This method has the same pre- and post-conditions asIntStream.LA(int)
. In addition, when the preconditions of this method are met, the return value is non-null and the value ofLT(k).getType()==LA(k)
.- Specified by:
LT
in interfaceTokenStream
- See Also:
IntStream.LA(int)
-
adjustSeekIndex
protected int adjustSeekIndex(int i)
Allowed derived classes to modify the behavior of operations which change the current stream position by adjusting the target token index of a seek operation. The default implementation simply returnsi
. If an exception is thrown in this method, the current stream index should not be changed.For example,
CommonTokenStream
overrides this method to ensure that the seek target is always an on-channel token.- Parameters:
i
- The target token index.- Returns:
- The adjusted target token index.
-
lazyInit
protected final void lazyInit()
-
setup
protected void setup()
-
setTokenSource
public void setTokenSource(TokenSource tokenSource)
Reset this token stream by setting its token source.
-
getTokens
public List<Token> getTokens(int start, int stop, Set<Integer> types)
Given a start and stop index, return a List of all tokens in the token type BitSet. Return null if no tokens were found. This method looks at both on and off channel tokens.
-
nextTokenOnChannel
protected int nextTokenOnChannel(int i, int channel)
Given a starting index, return the index of the next token on channel. Returni
iftokens[i]
is on channel. Return the index of the EOF token if there are no tokens on channel betweeni
and EOF.
-
previousTokenOnChannel
protected int previousTokenOnChannel(int i, int channel)
Given a starting index, return the index of the previous token on channel. Returni
iftokens[i]
is on channel. Return -1 if there are no tokens on channel betweeni
and 0.If
i
specifies an index at or after the EOF token, the EOF token index is returned. This is due to the fact that the EOF token is treated as though it were on every channel.
-
getHiddenTokensToRight
public List<Token> getHiddenTokensToRight(int tokenIndex, int channel)
Collect all tokens on specified channel to the right of the current token up until we see a token on DEFAULT_TOKEN_CHANNEL or EOF. If channel is -1, find any non default channel token.
-
getHiddenTokensToRight
public List<Token> getHiddenTokensToRight(int tokenIndex)
Collect all hidden tokens (any off-default channel) to the right of the current token up until we see a token on DEFAULT_TOKEN_CHANNEL or EOF.
-
getHiddenTokensToLeft
public List<Token> getHiddenTokensToLeft(int tokenIndex, int channel)
Collect all tokens on specified channel to the left of the current token up until we see a token on DEFAULT_TOKEN_CHANNEL. If channel is -1, find any non default channel token.
-
getHiddenTokensToLeft
public List<Token> getHiddenTokensToLeft(int tokenIndex)
Collect all hidden tokens (any off-default channel) to the left of the current token up until we see a token on DEFAULT_TOKEN_CHANNEL.
-
getSourceName
public String getSourceName()
Description copied from interface:IntStream
Gets the name of the underlying symbol source. This method returns a non-null, non-empty string. If such a name is not known, this method returnsIntStream.UNKNOWN_SOURCE_NAME
.- Specified by:
getSourceName
in interfaceIntStream
-
getText
public String getText()
Get the text of all tokens in this buffer.- Specified by:
getText
in interfaceTokenStream
- Returns:
- The text of all tokens in the stream.
-
getText
public String getText(Interval interval)
Description copied from interface:TokenStream
Return the text of all tokens within the specifiedinterval
. This method behaves like the following code (including potential exceptions for violating preconditions ofTokenStream.get(int)
, but may be optimized by the specific implementation.TokenStream stream = ...; String text = ""; for (int i = interval.a; i <= interval.b; i++) { text += stream.get(i).getText(); }
- Specified by:
getText
in interfaceTokenStream
- Parameters:
interval
- The interval of tokens within this stream to get text for.- Returns:
- The text of all tokens within the specified interval in this stream.
-
getText
public String getText(RuleContext ctx)
Description copied from interface:TokenStream
Return the text of all tokens in the source interval of the specified context. This method behaves like the following code, including potential exceptions from the call toTokenStream.getText(Interval)
, but may be optimized by the specific implementation.If
ctx.getSourceInterval()
does not return a valid interval of tokens provided by this stream, the behavior is unspecified.TokenStream stream = ...; String text = stream.getText(ctx.getSourceInterval());
- Specified by:
getText
in interfaceTokenStream
- Parameters:
ctx
- The context providing the source interval of tokens to get text for.- Returns:
- The text of all tokens within the source interval of
ctx
.
-
getText
public String getText(Token start, Token stop)
Description copied from interface:TokenStream
Return the text of all tokens in this stream betweenstart
andstop
(inclusive).If the specified
start
orstop
token was not provided by this stream, or if thestop
occurred before thestart
token, the behavior is unspecified.For streams which ensure that the
Token.getTokenIndex()
method is accurate for all of its provided tokens, this method behaves like the following code. Other streams may implement this method in other ways provided the behavior is consistent with this at a high level.TokenStream stream = ...; String text = ""; for (int i = start.getTokenIndex(); i <= stop.getTokenIndex(); i++) { text += stream.get(i).getText(); }
- Specified by:
getText
in interfaceTokenStream
- Parameters:
start
- The first token in the interval to get text for.stop
- The last token in the interval to get text for (inclusive).- Returns:
- The text of all tokens lying between the specified
start
andstop
tokens.
-
fill
public void fill()
Get all tokens from lexer until EOF
-
-