広告

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が、このトークナイザの「通常」文字であることを指定します。

関連:ordinaryChar(int ch)

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
}

関連記事

ページの先頭へ