blob: 2802c1071a1fc599eda2858ab40a3c29f5f6d3ed [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 1998, 2008 IBM Corporation and Others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Goh KONDOH - initial API and implementation
*******************************************************************************/
package org.eclipse.actf.model.dom.sgml;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.LineNumberReader;
import java.io.Reader;
/**
* Tokenizer interface
*/
abstract class SGMLTokenizer implements ISGMLConstants {
protected LineNumberReader reader;
public BufferedReader getReader() {
return this.reader;
}
/**
* token value.
*/
public String sval;
/**
* token type.
*/
public int ttype;
protected int state = DEFAULT;
protected boolean pushBacked;
/**
* Constructs SGMLTokenizer instance.
*
* @param reader
* reader that read SGML Documents.
*/
public SGMLTokenizer(Reader reader) {
this(reader, DEFAULT);
}
SGMLTokenizer(Reader reader, int state) {
if (reader instanceof LineNumberReader) {
this.reader = (LineNumberReader) reader;
} else {
this.reader = new LineNumberReader(reader);
}
this.state = state;
pushBacked = false;
}
abstract protected int defaultState() throws IOException, ParseException;
/**
* Gets Current Line Number.
*
* @return line number.
*/
public final int getCurrentLine() {
return reader.getLineNumber() + 1;
}
/**
* Get a token from a SGML document and return a type of the token.
*
* @return type of a read token.
* @exception IOException
* If an I/O error occurs
* @exception ParseException
* If an Unexpected EOF occurs
*/
public final int nextToken() throws IOException, ParseException {
if (pushBacked) {
pushBacked = false;
return ttype;
}
switch (state) {
case DEFAULT:
return defaultState();
case TAG:
return tag();
default:
return -1;
}
}
/**
* Push back tokens. Next call of nextToken() returns current ttype and sval
* will not change.
*/
public final void pushBack() {
pushBacked = true;
}
/**
* Character Ring Buffer for unread;
*/
protected int charBuffer[] = new int[BUF_SIZ];
public final static int BUF_SIZ = 1024;
protected int index = 0;
protected final int read() throws IOException {
if (index > 0) {
return charBuffer[--index];
} else {
return reader.read();
}
}
protected final void unread(int ch) {
charBuffer[index++] = ch;
}
final void switchTo(int state) {
this.state = state;
}
abstract protected int tag() throws ParseException, IOException;
final void close() throws IOException {
this.reader.close();
}
}