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:

  1. bruker-kode
  2. definisjoner av regulære uttrykk og direktiver til JLex
  3. 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:

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:
  1. 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).
  2. 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.