Ú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.