Guide til StreamTokenizer

1. Introduktion

I denne vejledning viser vi, hvordan man analyserer en strøm af tegn i tokens ved hjælp af Java StreamTokenizer klasse.

2. StreamTokenizer

Det StreamTokenizer klasse læser stream karakter for karakter. Hver af dem kan have nul eller flere af følgende attributter: hvidt mellemrum, alfabetisk, numerisk, streng citat eller kommentar karakter.

Nu skal vi forstå standardkonfigurationen. Vi har følgende typer tegn:

  • Word-tegn: varierer som 'a' til 'z' og 'A' til 'Z
  • Numeriske tegn: 0,1,…,9
  • Mellemrumstegn: ASCII-værdier fra 0 til 32
  • Kommentar karakter: /
  • String citat tegn: ‘Og“

Bemærk, at enderne af linjer behandles som mellemrum, ikke som separate tokens, og C / C ++ - stilkommentarer genkendes ikke som standard.

Denne klasse har et sæt vigtige felter:

  • TT_EOF - En konstant, der angiver slutningen af ​​strømmen
  • TT_EOL - En konstant, der angiver slutningen af ​​linjen
  • TT_NUMBER - En konstant, der angiver et tal-token
  • TT_WORD - En konstant, der angiver et ordtoken

3. Standardkonfiguration

Her skal vi skabe et eksempel for at forstå StreamTokenizer mekanisme. Vi starter med at oprette en forekomst af denne klasse og derefter kalde nextToken () metode, indtil den returnerer TT_EOF værdi:

privat statisk endelig int QUOTE_CHARACTER = '\' '; privat statisk endelig int DOUBLE_QUOTE_CHARACTER = '"'; offentlig statisk liste streamTokenizerWithDefaultConfiguration (Reader reader) kaster IOException {StreamTokenizer streamTokenizer = ny StreamTokenizer (læser); Liste tokens = ny ArrayList (); int currentToken = streamTokenizer.nextToken ! = StreamTokenizer.TT_EOF) {if (streamTokenizer.ttype == StreamTokenizer.TT_NUMBER) {tokens.add (streamTokenizer.nval);} ellers 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 indeholder simpelthen:

3 hurtige brune ræve springer over den "dovne" hund! # test1 // test2

Nu, hvis vi udskrev indholdet af arrayet, ville vi se:

Antal: 3.0 Ord: hurtig Ord: brun Ord: ræve Ord: spring Ord: over Ord: Ordet: doven Ord: hund Almindelig kul:! Almindelig char: # Word: test1

For bedre at forstå eksemplet er vi nødt til at forklare StreamTokenizer.ttype, StreamTokenizer.nval og StreamTokenizer.sval felter.

Det ttype felt indeholder typen af ​​det netop læste token. Det kunne være TT_EOF, TT_EOL, TT_NUMBER, TT_WORD. Imidlertid, for et citeret streng-token er dets værdi ASCII-værdien af citatkarakteren. Desuden, hvis tokenet er en almindelig karakter som ‘!'uden attributter, så ttype vil blive udfyldt med ASCII-værdien for det tegn.

Næste, vi bruger sval felt for at få tokenet, kun hvis det er et TT_WORD, det vil sige et ord token. Men hvis vi har at gøre med et citeret streng-token - sig “Doven” - så indeholder dette felt strengens brødtekst.

Sidst, vi har brugt nval felt for at få tokenet, kun hvis det er et nummer-token, der bruger TT_NUMBER.

4. Brugerdefineret konfiguration

Her ændrer vi standardkonfigurationen og opretter et andet eksempel.

Først, vi sætter nogle ekstra ordtegn ved hjælp af wordChars (int lav, int hi) metode. Derefter, vi gør kommentartegnet (‘/ ') til en almindelig og fremme ‘#' som den nye kommentar karakter.

Langt om længe, vi betragter slutningen af ​​linjen som et symbolsk tegn ved hjælp af eolIsSignificant (boolesk flag) metode.

Vi behøver kun at kalde disse metoder på streamTokenizer objekt:

offentlig statisk liste streamTokenizerWithCustomConfiguration (Reader reader) kaster IOException {StreamTokenizer streamTokenizer = ny StreamTokenizer (læser); Liste tokens = ny ArrayList (); streamTokenizer.wordChars ('!', '-'); streamTokenizer.ordinaryChar ('/'); streamTokenizer.commentChar ('#'); streamTokenizer.eolIsSignificant (true); // samme som før retur-tokens; }

Og her har vi en ny output:

// samme output som tidligere Word: "doven" Word: hund! Almindelig char: Almindelig char: Almindelig char: / Almindelig char: / Word: test2

Bemærk, at de dobbelte anførselstegn blev en del af tokenet, newline-tegnet er ikke længere et mellemrumstegn, men et almindeligt tegn og derfor et enkelt-tegn-token.

Også tegnene, der følger '#' -tegnet, springes nu over, og '/' er en almindelig karakter.

Vi kunne også ændre citatkarakteren med quoteChar (int ch) metode eller endda tegnene mellemrum ved at ringe whitespaceChars (int lav, int hi) metode. Der kan således foretages yderligere tilpasninger, der ringer StreamTokenizer'S metoder i forskellige kombinationer.

5. Konklusion

I denne vejledning vi har set, hvordan man analyserer en strøm af tegn i tokens ved hjælp af StreamTokenizer klasse. Vi har lært om standardmekanismen og oprettet et eksempel med standardkonfigurationen.

Endelig har vi ændret standardparametrene, og vi har bemærket, hvor fleksibel den er StreamTokenizer klasse er.

Som sædvanlig kan koden findes på GitHub.