Beskrivelse af FLEX

FLEX (Fast LEXical analyser generator) er en leksikalsk analysator, der kan køre under både PC og UNIX. Vi har valgt at bruge denne, da vi udelukkende udvikler Svendsk på PC-baserede computere. FLEX udspringer fra den ældre LEX, der udelukkende er tilgængelig i en UNIX-version.

FLEX er et værktøj, der bruges til at generere scanners. Scanners er programmer der kan genkende leksikalske mønstre i en tekst. Udfra nogle opsatte definitioner og regler, genererer FLEX C-kode (i filen lexyy.c) med en rutine kaldet yylex(). Hver gang rutinen kaldes, findes den næste token i teksten.

Syntaksen i FLEX skrives v.h.a. det, der kaldes regulære udtryk. Regulære udtryk kan sammenlignes med den kendte BNF (Backus Naur Form) syntaks, som bl.a. bruges i beskrivelser af DOS- og UNIX-kommandoer.

Følgende tabel giver et overblik over grundprincipperne i regulære udtryk.

Tabel 4-1: Grundprincipper i regulære udtryk
Sammensætning (Concatenation) xy Mønsteret består af x fulgt af y
Alternativ (Alternation) x|y Mønsteret består af enten x eller y
Arbitrær gentagelse (Arbitrary repetition) x* Mønsteret består af strengen x gentaget nul eller flere gange
Kilde: Introduction to Compiling Techniques, 2nd Edition (Tabel 5.2 side 75)


Ud over disse grundprincipper, er FLEX udvidet med sine egne. De er vist i nedenstående tabel.

Tabel 4-2: Udvidelser af grundprincipperne brugt af FLEX
Karakter klasser [0-9]

Et valg af karakterer i mængden; i dette tilfælde 0|1|2|3|4|5|6|7|8|9. Det er muligt at specificere mere end én mængde, fx [A-Za-z]

NOT operator ^

Angives som første tegn for at invertere det følgende, fx [^A-Z] betyder at der ikke må startes med stort bogstav

Arbitrær karakter .

Matcher alle tegn med undtagelse af ny linie

Enkel gentagelse x?

Nul eller én forekomst af x. I Svendsk bruges fx '-?' i definitionen for et tal, for at angive at der max. må forekomme ét minus-tegn.

Ikke-nul gentagelse x+

x gentaget én eller flere gange

Specificeret gentagelse x{n, m}

x gentaget mellem n og m gange

Begyndelse af linie ^x

Match kun x i begyndelsen af en linie

Slutning af linie x$

Match kun x i slutningen af en linie

Kontekst følsom ab/cd

Match kun ab når fulgt af cd

Kilde: Introduction to Compiling Techniques, 2nd Edition (Tabel 5.3 side 76)


Nogle gange er det nødvendigt at bruge tegn som FLEX selv bruger i sine principper. Nedenstående tabel viser hvordan man undgår problemer.

Tabel 4-3: Udvidelser der involverer tegn med speciel betydning
Litterære strenge "x"

Brug x og ikke en evt. speciel betydning. Dette kan især være brugbart i Svendsk, når der skal tjekkes for "()".

Litterære tegn \x

Hvis x er en operator, bruges x. Nyttigt i Svendsk, når vi i tekst-strenge bruger "-tegnet.

Definitioner {navn}

Erstat med predefineret mønster navn.

Kilde: Introduction to Compiling Techniques, 2nd Edition (Tabel 5.4 side 76)


Et FLEX-program har denne generelle form:


Definitioner

%%
Regler
%%
Egne rutiner, skrevet i C


Følgende eksempel er fra svendsk.l og viser et uddrag fra vores FLEX program.

 /* Definitioner */

 kommentar       ";>"[^"<;"\n]*"<;"
 mellemrum       [ \t\n]+
 tegn            [^\[\]\(\)] // ASCII undt. '[', ']', '(', ')'
 skriv_tekst     ({tegn})*

 %% /* Regler */

 {mellemrum}     { }
 {kommentar}     { }
 ">>"      { return(FELT_START) }
 "<<"      { return(FELT_STOP) }

 %% /* Kode */

 // Ingen kode endnu
 
Eksempel 4-1: Et FLEX program