Vodič za StreamTokenizer

1. Uvod

U ovom uputstvu pokazat ćemo kako raščlaniti tok znakova u tokene pomoću Jave StreamTokenizer razred.

2. StreamTokenizer

The StreamTokenizer klasa čita tok znaka po znak. Svaki od njih može imati nula ili više sljedeći atributi: razmak, abecedni, numerički, navodnik ili znak komentara.

Sada moramo razumjeti zadanu konfiguraciju. Imamo sljedeće vrste znakova:

  • Riječ znakova: rasponi poput "a" do "z" i "A" do "Z
  • Numerički znakovi: 0,1,…,9
  • Razmaci: ASCII vrijednosti od 0 do 32
  • Lik komentara: /
  • Znakovi citata u nizu: "I"

Imajte na umu da se krajevi redaka tretiraju kao razmaci, a ne kao zasebni tokeni, i komentari u stilu C / C ++ nisu prepoznati prema zadanim postavkama.

Ova klasa posjeduje niz važnih polja:

  • TT_EOF - Konstanta koja označava kraj toka
  • TT_EOL - Konstanta koja označava kraj retka
  • TT_NUMBER - Konstanta koja označava token broja
  • TT_WORD - Konstanta koja označava žeton riječi

3. Zadana konfiguracija

Ovdje ćemo stvoriti primjer kako bismo razumjeli StreamTokenizer mehanizam. Počet ćemo s izradom instance ove klase, a zatim nazvati nextToken () metoda dok ne vrati TT_EOF vrijednost:

privatni statički konačni int QUOTE_CHARACTER = '\' '; privatni statički konačni int DOUBLE_QUOTE_CHARACTER = '"'; javni statički popis streamTokenizerWithDefaultConfiguration (čitač čitača) baca IOException {StreamTokenizer streamTokenizer = novi StreamTokenizer (čitač); Popis žetona = novi ArrayList (); int currentTokenT (trenutniTokTokenTokenTokenTokenToken ! = StreamTokenizer.TT_EOF) {if (streamTokenizer.ttype == StreamTokenizer.TT_NUMBER) {tokens.add (streamTokenizer.nval);} else if (streamTokenizer.ttype == StreamTokenizer.TT_WORD || streamType = QUOT | streamTokenizer.ttype == DOUBLE_QUOTE_CHARACTER) {tokens.add (streamTokenizer.sval);} else {tokens.add ((char) currentToken);} currentToken = streamTokenizer.nextToken ();} return tokens;}

Probna datoteka jednostavno sadrži:

3 brze smeđe lisice preskaču "lijenog" psa! # test1 // test2

Sad, ako bismo ispisali sadržaj niza, vidjeli bismo:

Broj: 3.0 Riječ: brza Riječ: smeđa Riječ: lisice Riječ: skok Riječ: preko Riječi: Riječ: lijeni Riječ: pas Obični znak:! Obični znak: # Riječ: test1

Da bismo bolje razumjeli primjer, moramo objasniti StreamTokenizer.ttype, StreamTokenizer.nval i StreamTokenizer.sval polja.

The ttip polje sadrži vrstu upravo pročitanog tokena. To bi mogao biti TT_EOF, TT_EOL, TT_NUMBER, TT_WORD. Međutim, za citirani žeton niza njegova vrijednost je ASCII vrijednost citata. Štoviše, ako je token običan lik poput ‘!', bez atributa, tada ttip bit će popunjena ASCII vrijednošću tog znaka.

Sljedeći, koristimo sval polje za dobivanje tokena, samo ako je to TT_WORD, odnosno token riječi. Ali, ako imamo posla s navedenim žetonom niza - recimo "Lijen" - tada ovo polje sadrži tijelo niza.

Posljednji, koristili smo nval polje za dobivanje tokena, samo ako je to brojevni token, pomoću TT_NUMBER.

4. Prilagođena konfiguracija

Ovdje ćemo promijeniti zadanu konfiguraciju i stvoriti novi primjer.

Prvi, postavit ćemo neke znakove dodatne riječi pomoću wordChars (int low, int hi) metoda. Zatim, znak za komentar (‘/’) učinit ćemo običnim i promovirati ‘#' kao novi komentar.

Konačno, kraj retka smatrat ćemo znakovnim znakom uz pomoć eolIsSignificant (logička zastava) metoda.

Ove metode trebamo pozvati samo na streamTokenizer objekt:

javni statični popis streamTokenizerWithCustomConfiguration (čitač čitača) baca IOException {StreamTokenizer streamTokenizer = novi StreamTokenizer (čitač); Popis tokena = novi ArrayList (); streamTokenizer.wordChars ('!', '-'); streamTokenizer.ordinaryChar ('/'); streamTokenizer.commentChar ('#'); streamTokenizer.eolIsSignificant (true); // isto kao i prije povratnih žetona; }

I evo novog rezultata:

// isti izlaz kao i ranija Word: "lijena" Riječ: pas! Obični znak: Obični znak: Obični znak: / Obični znak: / Riječ: test2

Imajte na umu da su dvostruki navodnici postali dio tokena, znak novog retka više nije razmak, već obični znak, a samim tim i jednoznakovni žeton.

Također, znakovi koji slijede znak '#' sada se preskaču, a '/' je običan znak.

Mogli bismo i mi promijeni znak citata s quoteChar (int ch) metoda ili čak razmake putem pozivanja whitespaceChars (int low, int hi) metoda. Stoga se mogu izvršiti daljnja prilagođavanja StreamTokenizer'S metode u različitim kombinacijama.

5. Zaključak

U ovom vodiču, vidjeli smo kako raščlaniti tok znakova u tokene pomoću StreamTokenizer razred. Saznali smo o zadanom mehanizmu i stvorili smo primjer sa zadanom konfiguracijom.

Napokon, promijenili smo zadane parametre i primijetili smo koliko je fleksibilan StreamTokenizer razred je.

Kao i obično, kod se može naći na GitHubu.