| |
TokenizerOfStream tos = new TokenizerOfStream();
Вслед за этим мы вызываем метод TokenizeIt, определенный в классе
TokenizerOfStream, передавая ему в качестве параметра ссылку на входной поток:
tos.TokenizeIt(InStream);
Метод TokenizeIt выполняет разбор входного потока, отображая результаты
разбора на консоли. После выполнения разбора входной поток закрывается методом
close:
InStream.close();
Самое интересное в нашем приложении связано, очевидно, с классом
TokenizerOfStream, поэтому перейдем к его описанию.
В этом классе определен только один метод TokenizeIt:
public void TokenizeIt(InputStream is)
{
. . .
}
Получая в качестве параметра ссылку на входной поток, он прежде всего
создает для него разборщик класса StreamTokenizer:
StreamTokenizer stok;
stok = new StreamTokenizer(is);
Настройка параметров разборщика очень проста и сводится к вызовам всего двух
методов:
stok.slashSlashComments(true);
stok.ordinaryChar('.');
Метод slashSlashComments включает режим распознавания комментариев в стиле
языка программирования С++, а метод ordinaryChar объявляет символ ‘.’ обычным
символом.
После настройки запускается цикл разбора входного потока, причем условием
завершения цикла является достижение конца этого потока:
while(stok.nextToken() != StreamTokenizer.TT_EOF)
{
. . .
}
В цикле анализируется содержимое поля ttype, которое зависит от типа
элемента, обнаруженного во входном потоке:
switch(stok.ttype)
{
case StreamTokenizer.TT_WORD:
{
str = new String("\nTT_WORD >" + stok.sval);
break;
}
case StreamTokenizer.TT_NUMBER:
{
str = "\nTT_NUMBER >" + Double.toString(stok.nval);
break;
}
case StreamTokenizer.TT_EOL:
{
str = new String("> End of line");
break;
}
default:
{
if((char)stok.ttype == '"')
str = new String("\nTT_WORD >" + stok.sval);
else
str = "> " + String.valueOf((char)stok.ttype);
}
}
На слова и численные значения мы реагируем очень просто - записываем их
текстовое представление в рабочую переменную str типа String. При обнаружении
конца строки в эту переменную записывается строка End of line.
Если же обнаружен обычный символ, мы сравниваем его с символом кавычки. При
совпадении в переменную str записывается содержимое поля sval, в котором
находятся слова, обнаруженные внутри кавычек. Если же обнаруженный символ не
является символом кавычки, он преобразуется в строку и записывается в
переменную str.
В заключении метод выводит строку str в стандартный поток вывода, отображая
на консоли выделенный элемент потока:
System.out.println(str);
Класс StringTokenizer
Рассказывая о классе StreamTokenizer, нельзя не упомянуть о другом классе с
похожим названием и назначением, а именно о классе StringTokenizer.
Определение этого класса достаточно компактно, поэтому мы приведем его
полность
|
|