Sprievodca po aplikácii StreamTokenizer

1. Úvod

V tomto tutoriáli si ukážeme, ako pomocou Java analyzovať prúd znakov na tokeny StreamTokenizer trieda.

2. StreamTokenizer

The StreamTokenizer trieda číta prúd po znakoch. Každá z nich môže mať nulu alebo viac nasledujúce atribúty: prázdne miesto, abecedný, číselný znak, znak reťazca, úvodzovka alebo komentár.

Teraz musíme pochopiť predvolenú konfiguráciu. Máme nasledujúce typy znakov:

  • Slovné znaky: rozsahy ako „a“ až „z“ a „A“ až „Z
  • Číselné znaky: 0,1,…,9
  • Medzery: Hodnoty ASCII od 0 do 32
  • Znak komentára: /
  • Znaky s úvodzovkami: „A“

Konce riadkov sa považujú za biele medzery, nie za samostatné tokeny, a komentáre v štýle C / C ++ nie sú predvolene rozpoznané.

Táto trieda má súbor dôležitých oblastí:

  • TT_EOF - Konštanta označujúca koniec toku
  • TT_EOL - Konštanta označujúca koniec riadku
  • TT_NUMBER - Konštanta označujúca číselný znak
  • TT_WORD - Konštanta označujúca slovný token

3. Predvolená konfigurácia

Tu si vytvoríme príklad, aby sme pochopili StreamTokenizer mechanizmus. Začneme vytvorením inštancie tejto triedy a potom zavoláme znak nextToken () metóda, kým nevráti TT_EOF hodnota:

private static final int QUOTE_CHARACTER = '\' '; private static final int DOUBLE_QUOTE_CHARACTER = '"'; public static List streamTokenizerWithDefaultConfiguration (čítačka čítačky) hodí IOException {StreamTokenizer streamTokenizer = nový StreamTokenizer (čítačka); List tokens = nový ArrayList (); int currentToken = streamTokenizer.nextToken (); while (current ! = 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 ();} návratové tokeny;}

Testovací súbor jednoducho obsahuje:

3 rýchle hnedé líšky preskakujú „lenivého“ psa! # test1 // test2

Keby sme teraz vytlačili obsah poľa, videli by sme:

Počet: 3,0 Slovo: rýchle Slovo: hnedé Slovo: líšky Slovo: skok Slovo: cez Slovo: Slovo: lenivý Slovo: pes Bežný znak:! Bežný znak: # Slovo: test1

Pre lepšie pochopenie príkladu je potrebné vysvetliť StreamTokenizer.ttype, StreamTokenizer.nval a StreamTokenizer.sval polia.

The typ pole obsahuje typ práve prečítaného tokenu. To môže byť TT_EOF, TT_EOL, TT_NUMBER, TT_WORD. Avšak pre citovaný reťazcový token je jeho hodnotou hodnota ASCII znaku úvodzovky. Navyše, ak je token obyčajný znak ako ‘!', bez atribútov, potom typ sa vyplní hodnotou ASCII tohto znaku.

Ďalšie, používame sval pole na získanie tokenu, iba ak je to TT_WORD, teda slovný token. Ale ak máme do činenia s citovaným reťazcovým tokenom - povedzme „Lenivý“ - potom toto pole obsahuje telo reťazca.

Posledný, použili sme nval pole na získanie tokenu, iba ak ide o číselný token, pomocou TT_NUMBER.

4. Vlastná konfigurácia

Tu zmeníme predvolenú konfiguráciu a vytvoríme ďalší príklad.

Najprv, nastavíme nejaké ďalšie slovné znaky pomocou wordChars (int low, int hi) metóda. Potom, znak komentára („/“) urobíme obyčajným a propagovať ‘#' ako znak nového komentára.

Nakoniec koniec riadku budeme považovať za znak tokenu s pomocou eolIsSignificant (logická vlajka) metóda.

Tieto metódy musíme zavolať iba na streamTokenizer objekt:

public static List streamTokenizerWithCustomConfiguration (čítačka Reader) hodí IOException {StreamTokenizer streamTokenizer = nový StreamTokenizer (čítačka); Zoznam tokenov = new ArrayList (); streamTokenizer.wordChars ('!', '-'); streamTokenizer.ordinaryChar ('/'); streamTokenizer.commentChar ('#'); streamTokenizer.eolIsSignificant (true); // rovnaké ako pred návratovými tokenmi; }

A máme tu nový výstup:

// rovnaký výstup ako predchádzajúci Word: "lenivý" Word: pes! Bežný znak: Bežný znak: Bežný znak: / Bežný znak: / Slovo: test2

Upozorňujeme, že dvojité úvodzovky sa stali súčasťou tokenu, znak nového riadku už nie je znakom medzier, ale obyčajným znakom, a teda tokenom s jedným znakom.

Teraz sú preskočené aj znaky nasledujúce za znakom „#“ a znak „/“ je obyčajný znak.

Mohli by sme tiež zmeňte znak ponuky s quoteChar (int ch) metóda alebo dokonca medzery volaním whitespaceChars (int low, int hi) metóda. Je teda možné uskutočniť ďalšie prispôsobenia StreamTokenizerMetódy v rôznych kombináciách.

5. Záver

V tomto návode videli sme, ako analyzovať prúd znakov na tokeny pomocou StreamTokenizer trieda. Dozvedeli sme sa o predvolenom mechanizme a vytvorili sme príklad s predvolenou konfiguráciou.

Nakoniec sme zmenili predvolené parametre a všimli sme si, ako flexibilné sú StreamTokenizer trieda je.

Ako obvykle, kód nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found