package antlr; import java.util.Stack; /** * Combines and interleaves multiple streams of tokents together into a single stream. * Actions during token recognition change the token stream to be provided. This * simultaneously supports mark/rewind across changes in the token stream, recursive * use of token streams (for languages that nest in each other), and tracking of * such nesting (e.g., so if a nested language is terminated by a brack in an out * language. * *
*
* Software rights: http://www.antlr.org/license.html
*
* @see antlr.TokenBuffer
* @see antlr.Token
* @see antlr.TokenQueue
*/
public class TokenMultiBuffer extends TokenBuffer {
protected String[] myNames;
protected TokenStream[] myInputs;
protected Stack myMarkStreams = new Stack();
protected MarkRecord myLayers = null;
protected int myEnterCount = 0;
/** Create a token buffer */
public TokenMultiBuffer(TokenStream input_) {
this(new String[]{"base"}, new TokenStream[]{input_});
}
public TokenMultiBuffer(String[] names, TokenStream[] inputs) {
myNames = names;
myInputs = inputs;
input = myInputs[0];
}
public void push(String name) {
myLayers = new MarkRecord(myEnterCount, input, myLayers);
myEnterCount = 0;
select(findInput(name));
trace("push");
}
public void pop() {
trace("pop");
//TODO check for myNesting==0?
input = myLayers.stream;
myEnterCount = myLayers.enterCount;
myLayers = myLayers.next;
}
public void enterBrace() {
trace("enter");
myEnterCount++;
}
public void exitBrace() {
trace("exit");
if (myEnterCount <= 0) {
pop();
} else {
myEnterCount--;
}
}
public void select(int streamNum) {
input = myInputs[streamNum];
}
public void select(String name) {
input = myInputs[findInput(name)];
trace("select");
}
public int findInput(String name) {
for (int i = 0, max = myInputs.length; i