Содержание | Предыдущий | Следующий | Индекс

22.14 Класс java.io.StreamTokenizer

A StreamTokenizer берет входной поток и анализирует это в "маркеры", позволяя маркеры быть считанным по одному. Процессом парсинга управляют таблица и много флагов, которые могут быть установлены в различные состояния, позволяя распознавание идентификаторов, чисел, заключенных в кавычки строк, и комментариев в стандартном стиле.

public class StreamTokenizer {
	public static final int TT_EOF = -1;
	public static final int TT_EOL = '\n';
	public static final int TT_NUMBER = -2;
	public static final int TT_WORD = -3;
	public int ttype;
	public String sval;
	public double nval;
	public StreamTokenizer(InputStream in);
	public void resetSyntax();
	public void wordChars(int low, int hi);
	public void whitespaceChars(int low, int hi);
	public void ordinaryChars(int low, int hi);
	public void ordinaryChar(int ch);
	public void commentChar(int ch);
	public void quoteChar(int ch);
	public void parseNumbers();
	public void eolIsSignificant(boolean flag);
	public void slashStarComments(boolean flag);
	public void slashSlashComments(boolean flag);
	public void lowerCaseMode(boolean flag);
	public int nextToken() throws IOException;
	public void pushBack();
	public int lineno();
	public String toString();
}
Каждое побайтовое чтение от входного потока расценивается как символ в диапазоне '\u0000' через '\u00FF'. Символьное значение используется, чтобы искать пять возможных атрибутов символа: пробел, алфавитный, числовой, строковая кавычка, и символ комментария (у символа может быть больше чем один из этих атрибутов, или ни одного вообще). Кроме того, есть три управления флагов, должны ли разделители строки быть распознаны как маркеры, ли комментарии конца строки стиля Java, которые запускаются с // должен быть распознан и пропущен, и ли стиль Java "традиционные" комментарии, разграниченные /* и */ должен быть распознан и пропущен. Еще один флаг управляет, преобразовываются ли все символы идентификаторов в нижний регистр.

Вот простой пример использования a StreamTokenizer. Следующий код просто читает все маркеры в стандартном входном потоке и печатает идентификацию каждого. На изменения в номере строки также обращают внимание.

import java.io.StreamTokenizer;
import java.io.IOException;

class Tok {
	public static void main(String[] args) {
		StreamTokenizer st = new StreamTokenizer(System.in);
		st.ordinaryChar('/');
		int lineNum = -1;
		try {
			for (int tokenType = st.nextToken();
					tokenType != StreamTokenizer.TT_EOF;
					tokenType = st.nextToken()) {
				int newLineNum = st.lineno();
				if (newLineNum != lineNum) {
					System.out.println("[line " + newLineNum
											+ "]");
					lineNum = newLineNum;
				}
				switch(tokenType) {
				case StreamTokenizer.TT_NUMBER:
					System.out.println("the number " + st.nval);
					break;
				case StreamTokenizer.TT_WORD:
					System.out.println("identifier " + st.sval);
					break;
				default:
					System.out.println("  operator "
											+ (char)tokenType);
				}
			}
		} catch (IOException e) {
			System.out.println("I/O failure");
		}
	}
}
Если входной поток содержит эти данные:


10 LET A = 4.5
20 LET B = A*A
30 PRINT A, B
тогда получающийся вывод:


[line 1]
the number 10.0
identifier LET
identifier A
  operator =
the number 4.5
[line 2]
the number 20.0
identifier LET
identifier B
  operator =
identifier A
  operator *
identifier A
[line 3]
the number 30.0
identifier PRINT
identifier A
  operator ,
identifier B

22.14.1 public static final int TT_EOF = -1;

Была достигнута константа, которая указывает на конец файла.

22.14.2 public static final int TT_EOL = '\n';

Константа, которая указывает, что разделитель строки был распознан.

22.14.3 public static final int TT_NUMBER = -2;

Константа, которая указывает, что число было распознано.

22.14.4 public static final int TT_WORD = -3;

Константа, которая указывает, что слово (идентификатор) было распознано.

22.14.5 public int ttype;

Тип маркера, который был последний распознанный этим StreamTokenizer. Это будет TT_EOF, TT_EOL, TT_NUMBER, TT_WORD, или неотрицательное значение байта, которое было первым байтом маркера (например, если маркер является строковым маркером, то ttype имеет символ кавычки, который запустил строку).

22.14.6 public String sval;

Если значение ttype TT_WORD или строковый символ кавычки, тогда значение sval a String это содержит символы идентификатора или строки (без строковых кавычек разграничивания). Для всех других типов распознанных маркеров, значение sval null.

22.14.7 public double nval;

Если значение ttype TT_NUMBER, тогда значение nval численное значение числа.

22.14.8 public StreamTokenizer(InputStream in)

Этот конструктор инициализирует недавно создаваемый StreamTokenizer сохраняя его параметр, входной поток in, для более позднего использования. StreamTokenizer также инициализируется к следующему состоянию по умолчанию:

22.14.9 public void resetSyntax()

Синтаксическая таблица для этого StreamTokenizer сбрасывается так, чтобы каждое значение байта было "обычно"; таким образом никакой символ не распознается как являющийся пробелом, алфавитным, числовым, строковая кавычка, или символ комментария. Вызов этого метода поэтому эквивалентен:

ordinaryChars(0x00, 0xff)
Три флага, управляющие распознаванием разделителей строки, // комментарии, и /* комментарии незатронуты.

22.14.10 public void wordChars(int low, int hi)

Синтаксическая таблица для этого StreamTokenizer изменяется так, чтобы каждый символ в диапазоне low через hi имеет "алфавитный" атрибут.

22.14.11 public void whitespaceChars(int low, int hi)

Синтаксическая таблица для этого StreamTokenizer изменяется так, чтобы каждый символ в диапазоне low через hi имеет "пробельный" атрибут.

22.14.12 public void ordinaryChars(int low, int hi)

Синтаксическая таблица для этого StreamTokenizer изменяется так, чтобы каждый символ в диапазоне low через hi не имеет никаких атрибутов.

22.14.13 public void ordinaryChar(int ch)

Синтаксическая таблица для этого StreamTokenizer изменяется так, чтобы символ ch не имеет никаких атрибутов.

22.14.14 public void commentChar(int ch)

Синтаксическая таблица для этого StreamTokenizer изменяется так, чтобы символ ch имеет "атрибут" символа комментария.

22.14.15 public void quoteChar(int ch)

Синтаксическая таблица для этого StreamTokenizer изменяется так, чтобы символ ch имеет "строковый атрибут" кавычки.

22.14.16 public void parseNumbers()

Синтаксическая таблица для этого StreamTokenizer изменяется так, чтобы каждый из этих двенадцати символов

0 1 2 3 4 5 6 7 8 9 . -
имеет "числовой" атрибут.

22.14.17 public void eolIsSignificant(boolean flag)

Это StreamTokenizer впредь распознает разделители строки как маркеры если и только если flag параметр true.

22.14.18 public void slashStarComments(boolean flag)

Это StreamTokenizer впредь распознает и пропускает стиль Java "традиционные" комментарии, которые разграничиваются /* и */ и не вкладывайте, если и только если flag параметр true.

22.14.19 public void slashSlashComments(boolean flag)

Это StreamTokenizer впредь распознает и пропускает комментарии конца строки стиля Java, которые запускаются с // если и только если flag параметр true.

22.14.20 public void lowerCaseMode(boolean flag)

Это StreamTokenizer впредь преобразовывает все символы в идентификаторах к нижнему регистру если и только если flag параметр true.

22.14.21 public int nextToken() throws IOException

Если предыдущий маркер был пододвинут (§22.14.22) обратно, то значение ttype возвращается, эффективно заставляя тот же самый маркер быть перечитанным.

Иначе, этот метод анализирует следующий маркер в содержавшем входном потоке. Тип маркера возвращается; это то же самое значение также делается доступным в ttype поле, и связанные данные могут быть сделаны доступными в sval и nval поля.

Во-первых, пробельные символы пропускаются, за исключением того, что, если с разделителем строки встречаются и это StreamTokenizer в настоящий момент распознает разделители строки, тогда тип маркера TT_EOL.

Если с цифрой встречаются, то попытка предпринимается, чтобы распознать число. Если первый символ '-' и следующий символ не является числовым, тогда '-' как полагают, обычный символ и распознается как маркер самостоятельно. Иначе, число анализируется, останавливаясь перед следующим возникновением '-', второе возникновение '.', первый нечисловой символ встречался, или конец файла, какой бы ни на первом месте. Тип маркера TT_NUMBER и его значение делается доступным в поле nval.

Если с буквенным символом встречаются, то идентификатор распознается, состоя из того символа и всего после символов до, но не включая, первый символ, который не является ни алфавитным, ни числовым, или к концу файла, какой бы ни на первом месте. Символы идентификатора могут быть преобразованы в нижний регистр если это StreamTokenizer находится в строчном режиме.

Если с символом комментария встречаются, то все последующие символы пропускаются и игнорируются, до, но не включая разделитель следующей строки или конец файла. Затем другая попытка предпринимается, чтобы распознать маркер. Если это StreamTokenizer в настоящий момент распознает разделители строки, затем разделитель строки, который заканчивает комментарий, будет распознан как маркер тем же самым способом как любой другой разделитель строки в содержавшем входном потоке.

Если со строковым символом кавычки встречаются, то строка распознается, состоя из всех символов после (но не включая) строковый символ кавычки, до (но не включая) следующее возникновение того же самого строкового символа кавычки, или разделитель строки, или конец файла. Обычные escape-последовательности (§3.10.6) такой как \n и \t распознаются и преобразовываются в единственные символы, поскольку строка анализируется.

Если // встречается и это StreamTokenizer в настоящий момент распознает // комментарии, тогда все последующие символы пропускаются и игнорируются, до, но не включая разделитель следующей строки или конец файла. Затем другая попытка предпринимается, чтобы распознать маркер. (Если это StreamTokenizer в настоящий момент распознает разделители строки, затем разделитель строки, который заканчивает комментарий, будет распознан как маркер тем же самым способом как любой другой разделитель строки в содержавшем входном потоке.)

Если /* встречается и это StreamTokenizer в настоящий момент распознает /* комментарии, тогда все последующие символы пропускаются и игнорируются, до и включая следующее возникновение */ или конец файла. Затем другая попытка предпринимается, чтобы распознать маркер.

Если ни один из упомянутых выше случаев не применяется, то единственная другая возможность состоит в том, что первый непробельный символ, с которым встречаются, является обычным символом. Тот символ, как полагают, является маркером и сохранен в ttype поле и возвратилось.

22.14.22 public void pushBack()

Вызов этого метода "пододвигает текущий маркер обратно; то есть, это вызывает следующий звонок nextToken возвратить тот же самый маркер, который это только обеспечило. Отметьте, что этот метод не восстанавливает номер строки к своему предыдущему значению, так если метод lineno вызывается после звонка pushBack но перед следующим звонком nextToken, может быть возвращен неправильный номер строки.

22.14.23 public int lineno()

Число строки, на которой появился текущий маркер, возвращается. Первый маркер во входном потоке, если не разделитель строки, как полагают, появляется на строке 1. Маркер разделителя строки, как полагают, появляется на строке, которой он предшествует, не на строке, которую он завершает; таким образом первый разделитель строки во входном потоке, как полагают, находится на строке 2.

22.14.24 public String toString()

Текущий маркер и текущий номер строки преобразовываются в строку формы:

"Token[x], line m"
где м. является текущим номером строки в десятичной форме, и x зависит от типа текущего маркера:

Переопределения toString метод Object (§20.1.2).


Содержание | Предыдущий | Следующий | Индекс

Спецификация языка Java (HTML, сгенерированный Блинчиком "сюзет" Pelouch 24 февраля 1998)
Авторское право © Sun Microsystems, Inc 1996 года. Все права защищены
Пожалуйста, отправьте любые комментарии или исправления к doug.kramer@sun.com



Spec-Zone.ru - all specs in one place



free hit counter