Guide til StreamTokenizer

1. Introduksjon

I denne opplæringen viser vi hvordan du kan analysere en strøm av tegn til tokens ved hjelp av Java StreamTokenizer klasse.

2. StreamTokenizer

De StreamTokenizer klasse leser strømmen karakter for karakter. Hver av dem kan ha null eller mer av følgende attributter: hvitt mellomrom, alfabetisk, numerisk, streng sitat eller kommentar karakter.

Nå må vi forstå standardkonfigurasjonen. Vi har følgende typer tegn:

  • Ordtegn: varierer som ‘a’ til ‘z’ og ‘A’ til ‘Z
  • Numeriske tegn: 0,1,…,9
  • Mellomromstegn: ASCII-verdier fra 0 til 32
  • Kommentar karakter: /
  • String sitat tegn: ‘Og“

Merk at endene på linjene blir behandlet som mellomrom, ikke som separate tokens, og kommentarene i C / C ++ - stil gjenkjennes ikke som standard.

Denne klassen har et sett med viktige felt:

  • TT_EOF - En konstant som indikerer slutten på strømmen
  • TT_EOL - En konstant som indikerer slutten på linjen
  • TT_NUMBER - En konstant som indikerer et talltoken
  • TT_WORD - En konstant som indikerer et ordtegn

3. Standardkonfigurasjon

Her skal vi lage et eksempel for å forstå StreamTokenizer mekanisme. Vi begynner med å lage en forekomst av denne klassen og deretter kalle nextToken () metoden til den returnerer TT_EOF verdi:

privat statisk slutt int QUOTE_CHARACTER = '' '; privat statisk slutt int DOUBLE_QUOTE_CHARACTER = '"'; offentlig statisk liste streamTokenizerWithDefaultConfiguration (Reader reader) kaster IOException {StreamTokenizer streamTokenizer = ny StreamTokenizer (leser); Listetokener = ny ArrayList (); int currentToken = streamTokenizer.nextToken () ! = StreamTokenizer.TT_EOF) {if (streamTokenizer.ttype == StreamTokenizer.TT_NUMBER) {tokens.add (streamTokenizer.nval);} annet hvis (streamTokenizer.ttype == StreamTokenizer.TT_WORD || streamTokenizer.ttype == QUOTE_CHARACTER || streamTokenizer.ttype == DOUBLE_QUOTE_CHARACTER) {tokens.add (streamTokenizer.sval);} ellers {tokens.add ((char) currentToken);} currentToken = streamTokenizer.nextToken ();} return tokens;}

Testfilen inneholder ganske enkelt:

3 kjappe brune rev hopper over den "late" hunden! # test1 // test2

Nå, hvis vi skrev ut innholdet i matrisen, ville vi se:

Antall: 3.0 Ord: rask Ord: brun Ord: rev Ord: hopp Ord: over Ord: Ordet: lat Ord: hund Vanlig røye:! Vanlig røye: # Word: test1

For å bedre forstå eksemplet, må vi forklare StreamTokenizer.ttype, StreamTokenizer.nval og StreamTokenizer.sval Enger.

De ttype feltet inneholder typen token du nettopp har lest. Det kan det være TT_EOF, TT_EOL, TT_NUMBER, TT_WORD. Derimot, for et sitert strengtegn er verdien ASCII-verdien av sitatkarakteren. Videre, hvis token er en vanlig karakter som ‘!', uten attributter, deretter ttype vil bli fylt med ASCII-verdien til det tegnet.

Neste, vi bruker sval felt for å få token, bare hvis det er et TT_WORD, det vil si et ordtegn. Men hvis vi har å gjøre med et sitert strengtegn - si det “Lat” - så inneholder dette feltet strengen.

Siste, vi har brukt nval felt for å få token, bare hvis det er et talltoken, ved hjelp av TT_NUMBER.

4. Egendefinert konfigurasjon

Her endrer vi standardkonfigurasjonen og lager et annet eksempel.

Først, vi skal sette noen ekstra ordtegn ved hjelp av wordChars (int lav, int hi) metode. Deretter, vi vil gjøre kommentarfiguren (‘/’) til en vanlig og fremme ‘#' som den nye kommentarfiguren.

Endelig, vi vil se på slutten av linjen som et symboltegn ved hjelp av eolIsSignificant (boolsk flagg) metode.

Vi trenger bare å kalle disse metodene på streamTokenizer gjenstand:

offentlig statisk liste streamTokenizerWithCustomConfiguration (Reader reader) kaster IOException {StreamTokenizer streamTokenizer = ny StreamTokenizer (leser); Listetegn = ny ArrayList (); streamTokenizer.wordChars ('!', '-'); streamTokenizer.ordinaryChar ('/'); streamTokenizer.commentChar ('#'); streamTokenizer.eolIsSignificant (true); // samme som før returtegn; }

Og her har vi en ny produksjon:

// samme utgang som tidligere Word: "lat" Word: hund! Vanlig røye: Vanlig røye: Vanlig røye: / Vanlig røye: / Ord: test2

Legg merke til at de dobbelte anførselstegnene ble en del av tokenet, den nye linjekarakteren er ikke et mellomromstegn lenger, men et vanlig tegn, og derfor et tegn med ett tegn.

Også tegnene som følger '#' - tegnet hoppes nå over, og '/' er en vanlig karakter.

Vi kunne også endre sitattegnet med quoteChar (int ch) metode eller til og med de mellomromstegnene ved å ringe whitespaceChars (int lav, int hi) metode. Dermed kan ytterligere tilpasninger ringes StreamTokenizer‘S metoder i forskjellige kombinasjoner.

5. Konklusjon

I denne veiledningen, vi har sett hvordan man kan analysere en strøm av tegn i tokens ved hjelp av StreamTokenizer klasse. Vi har lært om standardmekanismen og opprettet et eksempel med standardkonfigurasjonen.

Til slutt har vi endret standardparametrene, og vi har lagt merke til hvor fleksibel StreamTokenizer klasse er.

Som vanlig kan du finne koden på GitHub.


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