INF225 2009: Kort introduksjon til JLex
Lex er en scanner-generator som lager kildekode i språket C. Vi skal
benytte en Java-versjon av Lex - JLex. Det finnes mer avansert utgave
av JLex som heter JFlex. JFlex er kompatibel med JLex, slik at alt som
kan gjøres i JLex også kan gjøres i JFlex. Vi anbefaler at studentene
bruker JFlex.
Nedlasting/installasjon
Nedlasting/installasjon:
Dokumentasjon
JFlex kommer med en utførlig manual. Det kan være lettere å komme i
gang med manualen
til JLex.
Bruk
I det følgende brukes "JLex" for både JLex og JFlex.
Input: .lex-fil. Output: .java-fil.
.lex-fil: Består av tre deler:
- bruker-kode
- definisjoner av regulære uttrykk og direktiver til JLex
- regler
Disse delene er
skilt fra hverandre i filen med linjer som kun inneholder de to
tegnene %%.
Bruker-kode
Alt du skriver her blir overført direkte til starten
på Java-filen som JLex genererer. Det må altså være gyldig
Java-kode for at filen skal kompilere.
Regulære uttrykk
På en linje: navn etterfulgt av tegnet =
etterfulgt av det regulære uttrykket. Eksempel:
snat = ("+"|"-")?[0-9]+
Merk:
- man kan bruke gåseøyne rundt karakterer for å skille dem fra
eventuelle meta-tegn.
- . matcher alle tegn utenom newline.
- hvis et regulært uttrykk skal brukes i definisjonen av et annet,
må navnet omsluttes med krølleparanteser: {snat}
Regler
Regler er på formen:
{exp} { ... kode ... }
der exp er et regulært uttrykk, definert over, og kode er Java-kode.
Sistnevnte vil bli utført av scanneren når førstnevnte matches.
Den genererte filen
JLex genererer en fil Yylex.java som inneholder en klasse ved navn
Yylex. Denne har en konstruktør som tar et Reader-objekt, som brukes
av scanneren til å lese inn data.
Videre har den en public metode yylex(). Denne brukes av
parseren til å hente neste token. yylex() returnerer et
objekt av typen Yytoken - som JLex antar er definert
eksternt. Når du kompilerer Yylex.java må du altså ha definert
klassen Yytoken (i en annen fil), ellers får du
kompileringsfeil. Når yylex() kalles, skjer følgende:
- Tegn leses inn helt til et regulært uttrykk matcher. Hvis flere
matcher brukes "the principle of longest substring". Dersom
lengste substring ikke matcher et unikt regulært uttrykk, brukes
det som står først i .lex-filen).
- Blokken som finnes i regelen for det regulære uttrykket
eksekveres. Denne blokken vil typisk inneholde et return-uttrykk,
som medfører at yylex() terminerer. Verdien som sendes
med return-uttrykket er et objekt av typen Yytoken (eller
deriverte typer). yylex() returnerer null hvis
det ikke er flere tegn igjen i Readeren. I denne blokken har man
tilgang på streng-verdien til tokenet gjennom yytext()-metoden.
Et av JLex-direktivene man kan sette inn i seksjon 2 er:
%{
...
%}
All kode som står mellom %{ og %} vil da bli kopiert direkte inn i klassen
Yylex.