Spec-Zone .ru
спецификации, руководства, описания, API
|
java.io.StreamTokenizer
StreamTokenizer
берет входной поток и анализирует это в "маркеры", позволяя маркеры быть считанным по одному. Процессом парсинга управляют таблица и много флагов, которые могут быть установлены в различные состояния, позволяя распознавание идентификаторов, чисел, заключенных в кавычки строк, и комментариев в стандартном стиле. public classКаждое побайтовое чтение от входного потока расценивается как символ в диапазонеStreamTokenizer
{ public static final intTT_EOF
= -1; public static final intTT_EOL
= '\n'; public static final intTT_NUMBER
= -2; public static final intTT_WORD
= -3; public intttype
; public Stringsval
; public doublenval
; publicStreamTokenizer
(InputStream in); public voidresetSyntax
(); public voidwordChars
(int low, int hi); public voidwhitespaceChars
(int low, int hi); public voidordinaryChars
(int low, int hi); public voidordinaryChar
(int ch); public voidcommentChar
(int ch); public voidquoteChar
(int ch); public voidparseNumbers
(); public voideolIsSignificant
(boolean flag); public voidslashStarComments
(boolean flag); public voidslashSlashComments
(boolean flag); public voidlowerCaseMode
(boolean flag); public intnextToken
() throws IOException; public voidpushBack
(); public intlineno
(); public StringtoString
(); }
'\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
также инициализируется к следующему состоянию по умолчанию:
'A'
через 'Z'
, 'a'
через 'z'
, и 0xA0
через 0xFF
как полагают, являются алфавитными.
0x00
через 0x20
как полагают, пробел.
'/'
символ комментария.
'\''
и двойная кавычка '"'
строковые символы кавычек.
//
комментарии и /*
комментарии не распознаются. 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 зависит от типа текущего маркера:
TT_EOF
, тогда x"EOF
".
TT_EOL
, тогда x"EOL
".
TT_WORD
, тогда x является текущей стоимостью sval
(§22.14.6).
TT_NUMBER
, тогда x"n=
"сопровождаемый результатом преобразования текущей стоимости nval
(§22.14.7) к строке (§20.10.15). toString
метод Object
(§20.1.2).
Содержание | Предыдущий | Следующий | Индекс
Спецификация языка Java (HTML, сгенерированный Блинчиком "сюзет" Pelouch 24 февраля 1998)
Авторское право © Sun Microsystems, Inc 1996 года. Все права защищены
Пожалуйста, отправьте любые комментарии или исправления к doug.kramer@sun.com