Útmutató a StreamTokenizerhez

1. Bemutatkozás

Ebben az oktatóanyagban megmutatjuk, hogyan lehet elemezni a karakterek áramát tokenekké a Java segítségével StreamTokenizer osztály.

2. StreamTokenizer

A StreamTokenizer osztály karakterenként olvassa az adatfolyamot. Mindegyiknek lehet nulla vagy több a következő attribútumok: szóköz, ábécé, numerikus, karakterlánc idézet vagy megjegyzés karakter.

Most meg kell értenünk az alapértelmezett konfigurációt. A következő típusú karakterek vannak:

  • Szó karakterek: olyan tartományok, mint „a” - „z” és „A” - „Z”
  • Numerikus karakterek: 0,1,…,9
  • Szóköz karakterek: ASCII értékek 0 és 32 között
  • Megjegyzés karakter: /
  • Karakterlánc idézőjelek: „És

Ne feledje, hogy a sorok végét szóközként kezelik, nem pedig külön jelzőként, és a C / C ++ - stílusú megjegyzéseket alapértelmezésben nem ismeri fel.

Ennek az osztálynak számos fontos területe van:

  • TT_EOF - A patak végét jelző állandó
  • TT_EOL - A vonal végét jelző állandó
  • TT_NUMBER - Számjelzőt jelölő állandó
  • TT_WORD - A szójelzőt jelölő állandó

3. Alapértelmezett konfiguráció

Itt fogunk létrehozni egy példát a StreamTokenizer gépezet. Először létrehozunk egy példányt ebből az osztályból, majd felhívjuk a nextToken () metódust, amíg vissza nem adja a TT_EOF érték:

privát statikus végső int QUOTE_CHARACTER = '\' '; private static final int DOUBLE_QUOTE_CHARACTER = '"'; public static List streamTokenizerWithDefaultConfiguration (Reader reader) dobja az IOException-t {StreamTokenizer streamTokenizer = új StreamTokenizer (olvasó); List tokenek = új ArrayList (); int currentToken = currentToken (currentTokenizer ! = StreamTokenizer.TT_EOF) {if (streamTokenizer.ttype == StreamTokenizer.TT_NUMBER) {tokens.add (streamTokenizer.nval);} else if (streamTokenizer.ttype == StreamTokenizer.TT_WORD || streamTokenizer.ttype == QUOTE_CHARACTER || streamTokenizer.ttype == DOUBLE_QUOTE_CHARACTER) {tokens.add (streamTokenizer.sval);} else {tokens.add ((char) currentToken);} currentToken = streamTokenizer.nextToken ();} tokenek visszatérése;}

A tesztfájl egyszerűen a következőket tartalmazza:

3 gyors barna róka ugrik át a "lusta" kutyán! # test1 // teszt2

Ha kinyomtatnánk a tömb tartalmát, a következőket látnánk:

Szám: 3,0 Szó: gyors Szó: barna Szó: rókák Szó: ugrás Szó: át szó: a Szó: lusta Szó: kutya Rendes char:! Rendes karakter: # Szó: teszt1

A példa jobb megértése érdekében meg kell magyaráznunk a StreamTokenizer.ttype, StreamTokenizer.nval és StreamTokenizer.sval mezők.

A típus mező az imént elolvasott token típusát tartalmazza. Lehet, hogy TT_EOF, TT_EOL, TT_NUMBER, TT_WORD. Azonban, egy idézett karakterlánc esetében az értéke az ASCII értéke az idézet karakterének. Sőt, ha a token egy közönséges karakter, például ‘!', attribútumok nélkül, akkor a típus a karakter ASCII értékével lesz feltöltve.

Következő, használjuk sval mezőt a token megszerzéséhez, csak ha a TT_WORD, vagyis egy szójelző. De ha idézett karakterlánc-tokennel van dolgunk - mondjuk „Lusta” - akkor ez a mező tartalmazza a húr törzsét.

Utolsó, használtuk a nval mezőt a token megszerzéséhez, csak akkor, ha ez egy számkód, a TT_NUMBER.

4. Egyéni konfiguráció

Itt megváltoztatjuk az alapértelmezett konfigurációt, és létrehozunk egy másik példát.

Első, néhány extra szó karaktert fogunk beállítani a wordChars (int alacsony, int hi) módszer. Azután, a komment karaktert (’/’) közönségessé tesszük és elősegítik ‘#' mint az új kommentkarakter.

Végül, a sor végét token karakternek tekintjük segítségével eolIsSignificant (logikai zászló) módszer.

Ezeket a módszereket csak a streamTokenizer tárgy:

public static List streamTokenizerWithCustomConfiguration (Reader olvasó) dobja az IOException-t {StreamTokenizer streamTokenizer = új StreamTokenizer (olvasó); Lista tokenek = new ArrayList (); streamTokenizer.wordChars ('!', '-'); streamTokenizer.ordinaryChar ('/'); streamTokenizer.commentChar ('#'); streamTokenizer.eolIsSignificant (true); // ugyanaz, mint a return tokenek előtt; }

És itt van egy új kimenetünk:

// ugyanaz a kimenet, mint a korábbi Word: "lusta" Word: kutya! Rendes char: Rendes char: Rendes char: / Rendes char: / Szó: test2

Ne feledje, hogy a dupla idézőjelek a token részévé váltak, az újsoros karakter már nem egy szóköz, hanem egy hétköznapi karakter, tehát egy karakteres token.

Ezenkívül a „#” karaktert követő karakterek kihagyásra kerülnek, és a „/” közönséges karakter.

Mi is tehetnénk változtassa meg az idézet karakterét a quoteChar (int ch) módszer vagy akár a szóköz karaktereit hívással whitespaceChars (int alacsony, int hi) módszer. Így további testreszabások hívhatók StreamTokenizerMódszerei különböző kombinációkban.

5. Következtetés

Ebben az oktatóanyagban láttuk, hogyan kell elemezni a karakterek áramát tokenekké a StreamTokenizer osztály. Megtanultuk az alapértelmezett mechanizmust, és létrehoztunk egy példát az alapértelmezett konfigurációval.

Végül megváltoztattuk az alapértelmezett paramétereket, és észrevettük, hogy milyen rugalmasak StreamTokenizer osztály az.

Szokás szerint a kód megtalálható a GitHubon.