Java : StreamTokenizer (字句解析) - API使用例
StreamTokenizer (Java SE 19 & JDK 19) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。
概要
StreamTokenizerクラスは、入力ストリームを引数に取り、それを「トークン」に構文解析し、一度に1つのトークンを読めるようにします。 構文解析処理は、さまざまな状態に設定可能ないくつかのフラグと1つの表によって制御されます。 ストリーム・トークナイザは、識別子、数値、引用文字列、および各種のコメント・スタイルを認識できます。
StreamTokenizerクラスを使うと、ホワイトスペースで区切られたトークン(単語や数値、引用文字列) を解析して取得することができます。
比較的単純な構文であれば便利だと思います。
final var s = """
abcd 1234
"X Y Z"
""";
try (final var reader = new StringReader(s)) {
final var tokenizer = new StreamTokenizer(reader);
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // abcd
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_NUMBER); // true
System.out.println(tokenizer.nval); // 1234.0
System.out.println(tokenizer.nextToken() == '"'); // true
System.out.println(tokenizer.sval); // X Y Z
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_EOF); // true
}
フィールド
double nval
現在のトークンが数値の場合、このフィールドにはその数値が入ります。
このメソッドの使用例は、nextToken() にまとめて記載しました。
そちらのAPI使用例をご参照ください。
String sval
現在のトークンがワード・トークンの場合、このフィールドには、ワード・トークンの文字を表す文字列が入ります。
このメソッドの使用例は、nextToken() にまとめて記載しました。
そちらのAPI使用例をご参照ください。
static final int TT_EOF
ストリームの終わりが読み込まれたことを示す定数です。
final var s = "abcd\nXYZ";
try (final var reader = new StringReader(s)) {
final var tokenizer = new StreamTokenizer(reader);
tokenizer.eolIsSignificant(true);
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // abcd
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_EOL); // true
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // XYZ
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_EOF); // true
}
static final int TT_EOL
行の終わりが読み込まれたことを示す定数です。
このメソッドの使用例は、TT_EOF にまとめて記載しました。
そちらのAPI使用例をご参照ください。
static final int TT_NUMBER
数値トークンが読み込まれたことを示す定数です。
このメソッドの使用例は、nextToken() にまとめて記載しました。
そちらのAPI使用例をご参照ください。
static final int TT_WORD
ワード・トークンが読み込まれたことを示す定数です。
このメソッドの使用例は、nextToken() にまとめて記載しました。
そちらのAPI使用例をご参照ください。
int ttype
nextTokenメソッドの呼出しのあと、このフィールドには読み込まれたばかりのトークンの型が入ります。
final var s = "abcd 1234 XYZ";
try (final var reader = new StringReader(s)) {
final var tokenizer = new StreamTokenizer(reader);
tokenizer.nextToken();
System.out.println(tokenizer.ttype == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // abcd
tokenizer.nextToken();
System.out.println(tokenizer.ttype == StreamTokenizer.TT_NUMBER); // true
System.out.println(tokenizer.nval); // 1234.0
tokenizer.nextToken();
System.out.println(tokenizer.ttype == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // XYZ
tokenizer.nextToken();
System.out.println(tokenizer.ttype == StreamTokenizer.TT_EOF); // true
}
コンストラクタ
StreamTokenizer (InputStream is)
非推奨。 JDK Version 1.1以降、入力ストリームをトークン化するには、次のようにして入力ストリームを文字ストリームに変換することが推奨されています。
非推奨です。
StreamTokenizer (Reader r)
指定された文字ストリームを構文解析するトークナイザを作成します。
final var s = "abcd XYZ";
try (final var reader = new StringReader(s)) {
final var tokenizer = new StreamTokenizer(reader);
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // abcd
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // XYZ
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_EOF); // true
}
メソッド
void commentChar (int ch)
引数で指定された文字以降は、1行のコメント行であることを指定します。
final var s = """
abcd
# comment
XYZ
""";
try (final var reader = new StringReader(s)) {
final var tokenizer = new StreamTokenizer(reader);
tokenizer.commentChar('#');
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // abcd
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // XYZ
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_EOF); // true
}
void eolIsSignificant (boolean flag)
行の終わりをトークンとして処理するかどうかを判別します。
このメソッドの使用例は、TT_EOF にまとめて記載しました。
そちらのAPI使用例をご参照ください。
int lineno ()
現在の行番号を返します。
final var s = """
abcd 1234
XYZ
""";
try (final var reader = new StringReader(s)) {
final var tokenizer = new StreamTokenizer(reader);
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // abcd
System.out.println(tokenizer.lineno()); // 1
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_NUMBER); // true
System.out.println(tokenizer.nval); // 1234.0
System.out.println(tokenizer.lineno()); // 1
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // XYZ
System.out.println(tokenizer.lineno()); // 2
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_EOF); // true
System.out.println(tokenizer.lineno()); // 3
}
void lowerCaseMode (boolean fl)
ワード・トークンを自動的に小文字にするかどうかを判別します。
final var s = "abcd XYZ";
try (final var reader = new StringReader(s)) {
final var tokenizer = new StreamTokenizer(reader);
tokenizer.lowerCaseMode(true);
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // abcd
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // xyz
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_EOF); // true
}
int nextToken ()
このトークナイザの入力ストリームの次のトークンを構文解析します。
final var s = "abcd 1234 XYZ";
try (final var reader = new StringReader(s)) {
final var tokenizer = new StreamTokenizer(reader);
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // abcd
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_NUMBER); // true
System.out.println(tokenizer.nval); // 1234.0
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // XYZ
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_EOF); // true
}
void ordinaryChar (int ch)
文字引数がこのトークナイザの「通常」文字であることを指定します。
final var s = "abcQxyz";
try (final var reader = new StringReader(s)) {
final var tokenizer = new StreamTokenizer(reader);
tokenizer.ordinaryChar('Q');
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // abc
System.out.println(tokenizer.nextToken() == 'Q'); // true
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // xyz
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_EOF); // true
}
try (final var reader = new StringReader(s)) {
final var tokenizer = new StreamTokenizer(reader);
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // abcQxyz
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_EOF); // true
}
void ordinaryChars (int low, int hi)
low <= c <= highの範囲内のすべての文字cが、このトークナイザの「通常」文字であることを指定します。
final var s = "AAAxBBByCCCzDDD";
try (final var reader = new StringReader(s)) {
final var tokenizer = new StreamTokenizer(reader);
tokenizer.ordinaryChars('x', 'z');
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // AAA
System.out.println(tokenizer.nextToken() == 'x'); // true
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // BBB
System.out.println(tokenizer.nextToken() == 'y'); // true
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // CCC
System.out.println(tokenizer.nextToken() == 'z'); // true
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // DDD
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_EOF); // true
}
void parseNumbers ()
このトークナイザで数値を構文解析するように指定します。
final var s = "123";
try (final var reader = new StringReader(s)) {
final var tokenizer = new StreamTokenizer(reader);
tokenizer.resetSyntax();
System.out.println(tokenizer.nextToken() == '1'); // true
System.out.println(tokenizer.nextToken() == '2'); // true
System.out.println(tokenizer.nextToken() == '3'); // true
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_EOF); // true
}
try (final var reader = new StringReader(s)) {
final var tokenizer = new StreamTokenizer(reader);
tokenizer.resetSyntax();
tokenizer.parseNumbers();
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_NUMBER); // true
System.out.println(tokenizer.nval); // 123.0
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_EOF); // true
}
void pushBack ()
このトークナイザの次のnextTokenメソッド呼出しでttypeフィールドの現行値を返し、nvalまたはsvalフィールドの値は変更しないようにします。
final var s = "abcd 1234";
try (final var reader = new StringReader(s)) {
final var tokenizer = new StreamTokenizer(reader);
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // abcd
tokenizer.pushBack();
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // abcd
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_NUMBER); // true
System.out.println(tokenizer.nval); // 1234.0
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_EOF); // true
}
void quoteChar (int ch)
この文字に一致するペアで、このトークナイザの文字列定数を区切るように指定します。
final var s = """
abcd
=1234 XYZ=
""";
try (final var reader = new StringReader(s)) {
final var tokenizer = new StreamTokenizer(reader);
tokenizer.quoteChar('=');
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // abcd
System.out.println(tokenizer.nextToken() == '='); // true
System.out.println(tokenizer.sval); // 1234 XYZ
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_EOF); // true
}
void resetSyntax ()
このトークナイザの構文表をリセットし、すべての文字を「通常」文字にします。
このメソッドの使用例は、parseNumbers() にまとめて記載しました。
そちらのAPI使用例をご参照ください。
void slashSlashComments (boolean flag)
トークナイザがC++スタイルのコメントを認識するかどうかを判別します。
final var s = """
abcd // comment
XYZ
""";
try (final var reader = new StringReader(s)) {
final var tokenizer = new StreamTokenizer(reader);
tokenizer.ordinaryChar('/');
tokenizer.slashSlashComments(true);
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // abcd
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // XYZ
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_EOF); // true
}
try (final var reader = new StringReader(s)) {
final var tokenizer = new StreamTokenizer(reader);
tokenizer.ordinaryChar('/');
tokenizer.slashSlashComments(false);
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // abcd
System.out.println(tokenizer.nextToken() == '/'); // true
System.out.println(tokenizer.nextToken() == '/'); // true
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // comment
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // XYZ
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_EOF); // true
}
void slashStarComments (boolean flag)
トークナイザがCスタイルのコメントを認識するかどうかを判別します。
final var s = "abcd /* comment */ XYZ";
try (final var reader = new StringReader(s)) {
final var tokenizer = new StreamTokenizer(reader);
tokenizer.ordinaryChar('/');
tokenizer.slashStarComments(true);
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // abcd
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // XYZ
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_EOF); // true
}
try (final var reader = new StringReader(s)) {
final var tokenizer = new StreamTokenizer(reader);
tokenizer.ordinaryChar('/');
tokenizer.slashStarComments(false);
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // abcd
System.out.println(tokenizer.nextToken() == '/'); // true
System.out.println(tokenizer.nextToken() == '*'); // true
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // comment
System.out.println(tokenizer.nextToken() == '*'); // true
System.out.println(tokenizer.nextToken() == '/'); // true
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // XYZ
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_EOF); // true
}
String toString ()
現在のストリーム・トークンの文字列表現と、それが発生する行番号を返します。
final var s = """
abcd
1234
""";
try (final var reader = new StringReader(s)) {
final var tokenizer = new StreamTokenizer(reader);
tokenizer.nextToken();
final var str1 = tokenizer.toString();
System.out.println(str1); // Token[abcd], line 1
tokenizer.nextToken();
final var str2 = tokenizer.toString();
System.out.println(str2); // Token[n=1234.0], line 2
tokenizer.nextToken();
final var str3 = tokenizer.toString();
System.out.println(str3); // Token[EOF], line 3
}
void whitespaceChars (int low, int hi)
low <= c <= highの範囲内のすべての文字cが空白文字であることを指定します。
final var s = "AAAxBBByCCCzDDD";
try (final var reader = new StringReader(s)) {
final var tokenizer = new StreamTokenizer(reader);
tokenizer.whitespaceChars('x', 'z');
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // AAA
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // BBB
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // CCC
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // DDD
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_EOF); // true
}
void wordChars (int low, int hi)
low <= c <= highの範囲内のすべての文字cがワード構成要素であることを指定します。
final var s = "abcdef";
try (final var reader = new StringReader(s)) {
final var tokenizer = new StreamTokenizer(reader);
tokenizer.resetSyntax();
tokenizer.wordChars('a', 'c');
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_WORD); // true
System.out.println(tokenizer.sval); // abc
System.out.println(tokenizer.nextToken() == 'd'); // true
System.out.println(tokenizer.nextToken() == 'e'); // true
System.out.println(tokenizer.nextToken() == 'f'); // true
System.out.println(tokenizer.nextToken() == StreamTokenizer.TT_EOF); // true
}