All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.antlr.v4.runtime.CommonTokenStream Maven / Gradle / Ivy

There is a newer version: 4.9.0
Show newest version
/*
 * [The "BSD license"]
 *  Copyright (c) 2012 Terence Parr
 *  Copyright (c) 2012 Sam Harwell
 *  All rights reserved.
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions
 *  are met:
 *
 *  1. Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *  2. Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *  3. The name of the author may not be used to endorse or promote products
 *     derived from this software without specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 *  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 *  OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 *  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 *  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package org.antlr.v4.runtime;

import org.antlr.v4.runtime.misc.NotNull;

/**
 * This class extends {@link BufferedTokenStream} with functionality to filter
 * token streams to tokens on a particular channel (tokens where
 * {@link Token#getChannel} returns a particular value).
 *
 * 

* This token stream provides access to all tokens by index or when calling * methods like {@link #getText}. The channel filtering is only used for code * accessing tokens via the lookahead methods {@link #LA}, {@link #LT}, and * {@link #LB}.

* *

* By default, tokens are placed on the default channel * ({@link Token#DEFAULT_CHANNEL}), but may be reassigned by using the * {@code ->channel(HIDDEN)} lexer command, or by using an embedded action to * call {@link Lexer#setChannel}. *

* *

* Note: lexer rules which use the {@code ->skip} lexer command or call * {@link Lexer#skip} do not produce tokens at all, so input text matched by * such a rule will not be available as part of the token stream, regardless of * channel.

*/ public class CommonTokenStream extends BufferedTokenStream { /** * Specifies the channel to use for filtering tokens. * *

* The default value is {@link Token#DEFAULT_CHANNEL}, which matches the * default channel assigned to tokens created by the lexer.

*/ protected int channel = Token.DEFAULT_CHANNEL; /** * Constructs a new {@link CommonTokenStream} using the specified token * source and the default token channel ({@link Token#DEFAULT_CHANNEL}). * * @param tokenSource The token source. */ public CommonTokenStream(@NotNull TokenSource tokenSource) { super(tokenSource); } /** * Constructs a new {@link CommonTokenStream} using the specified token * source and filtering tokens to the specified channel. Only tokens whose * {@link Token#getChannel} matches {@code channel} or have the * {@link Token#getType} equal to {@link Token#EOF} will be returned by the * token stream lookahead methods. * * @param tokenSource The token source. * @param channel The channel to use for filtering tokens. */ public CommonTokenStream(@NotNull TokenSource tokenSource, int channel) { this(tokenSource); this.channel = channel; } @Override protected int adjustSeekIndex(int i) { return nextTokenOnChannel(i, channel); } @Override protected Token LB(int k) { if ( k==0 || (p-k)<0 ) return null; int i = p; int n = 1; // find k good tokens looking backwards while ( n<=k ) { // skip off-channel tokens i = previousTokenOnChannel(i - 1, channel); n++; } if ( i<0 ) return null; return tokens.get(i); } @Override public Token LT(int k) { //System.out.println("enter LT("+k+")"); lazyInit(); if ( k == 0 ) return null; if ( k < 0 ) return LB(-k); int i = p; int n = 1; // we know tokens[p] is a good one // find k good tokens while ( nrange ) range = i; return tokens.get(i); } /** Count EOF just once. */ public int getNumberOfOnChannelTokens() { int n = 0; fill(); for (int i = 0; i < tokens.size(); i++) { Token t = tokens.get(i); if ( t.getChannel()==channel ) n++; if ( t.getType()==Token.EOF ) break; } return n; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy