CivlcTokenSubSequence.java

package edu.udel.cis.vsl.abc.token.common;

import java.util.Collection;

import org.antlr.runtime.Token;

import edu.udel.cis.vsl.abc.front.IF.CivlcTokenConstant;
import edu.udel.cis.vsl.abc.token.IF.CivlcToken;
import edu.udel.cis.vsl.abc.token.IF.CivlcTokenSequence;
import edu.udel.cis.vsl.abc.token.IF.CivlcTokenSource;
import edu.udel.cis.vsl.abc.token.IF.FileIndexer;
import edu.udel.cis.vsl.abc.token.IF.SourceFile;
import edu.udel.cis.vsl.abc.token.IF.TokenFactory;

public class CivlcTokenSubSequence implements CivlcTokenSequence {

	int startTokenIndex;

	int lastTokenIndex;

	CivlcTokenSource rootSource;

	CivlcToken eofToken;

	/**
	 * A helper class which represents a subsequence of sequence of tokens
	 * through the CTokenSource abstraction.
	 * 
	 * @author siegel
	 * 
	 */
	class SubTokenSource implements CivlcTokenSource {

		int currentTokenIndex = startTokenIndex;

		@Override
		public Token nextToken() {
			if (currentTokenIndex > lastTokenIndex) {
				return eofToken;
			} else {
				Token result = rootSource.getToken(currentTokenIndex);

				currentTokenIndex++;
				return result;
			}
		}

		@Override
		public String getSourceName() {
			return rootSource.getSourceName();
		}

		@Override
		public int getNumTokens() {
			return currentTokenIndex - startTokenIndex;
		}

		@Override
		public CivlcToken getToken(int index) {
			return rootSource.getToken(index);
		}

		@Override
		public TokenFactory getTokenFactory() {
			return rootSource.getTokenFactory();
		}

		@Override
		public FileIndexer getIndexer() {
			return rootSource.getIndexer();
		}

		@Override
		public Collection<SourceFile> getSourceFiles() {
			return rootSource.getSourceFiles();
		}
	}

	public CivlcTokenSubSequence(CivlcTokenSource rootSource,
			int startTokenIndex, int lastTokenIndex) {
		this.rootSource = rootSource;
		this.startTokenIndex = startTokenIndex;
		this.lastTokenIndex = lastTokenIndex;
		this.eofToken = rootSource.getTokenFactory().newCivlcToken(
				CivlcTokenConstant.EOF, "EOF",
				rootSource.getTokenFactory().newSystemFormation(
						"CivlcTokenSubSequence Constructor"),
				rootSource.getToken(0).getTokenVocab());
	}

	@Override
	public CivlcTokenSource newSource() {
		return new SubTokenSource();
	}

	@Override
	public CivlcToken[] getTokens() {
		int numTokens = size();
		CivlcToken[] result = new CivlcToken[numTokens];

		for (int i = 0; i < numTokens; i++) {
			result[i] = rootSource.getToken(startTokenIndex + i);
		}
		return result;
	}

	@Override
	public int size() {
		return lastTokenIndex - startTokenIndex + 1;
	}

	@Override
	public CivlcToken getEOFToken() {
		return this.eofToken;
	}
}