FSA Tutorial
1. Gebruik van FSA
1.1. Vooraf
Het programma FSA vind je op hagen in
/users1/vannoord/bin/fsa
en op tcw2 in
/home/vannoord/Linux/bin/fsa
Als je niet steeds dit pad wilt invullen doe je er goed aan deze bin directories
aan je PATH toe te voegen (ask your local unix guru).
N.b. Fsa werkt niet op de tcwxN machines in practicumzaal 229 (Munting). Om fsa te kunnen gebruiken
moet je eerst inloggen op tcw2. Gebruik hiervoor bij voorkeur ssh:
ssh tcw2
1.2. FSA starten
Start fsa nu met het commando
fsa tkconsol=on -tk
(eventueel het colledige pad geven). Je ziet nu een scherm met daarin een regel 'Regex'
waarin je reguliere expressies kunt invullen, en een regel 'string'
waarin je strings kunt invoeren die door de reguliere expressie al dan
niet geaccepteerd worden. Het grootste deel van het scherm zal de automaat
laten zien die gecompileerd wordt op basis van de reguliere expressie die
in 'Regex' is ingevuld. Het onderste deel van het scherm geeft mededelingen van het
programma, vooral van belang voor foutmeldingen. Bovendien wordt hier, als je een woord
intypt bij 'string', weergegeven of het woord al dan niet door de automaat geaccepteerd wordt.
Er is een manual
voor FSA waarin de syntaxis van reguliere expressies wordt beschreven,
en de (vele) extra opties die het systeem kent.
Wanneer je FSA niet tot je beschikking hebt, kun je gebruik maken
van de on-line demonstratie
versie. Bij deze demo-versie hoort ook een
alternatieve tutorial.
2. Een paar eenvoudige voorbeelden van reguliere expressies:
-
[a*,b*] : definieert de taal die bestaat uit een willekeurig aantal
a's, gevolgd door een willekeurig aantal b's. De strings aaabb,
aab, aaaaa, bbb worden allemaal herkend door deze expressie, de strings
aba,
bbaa, acb, cab niet.
-
[a,b]* definieert de taal die bestaat uit een willekeurig aantal keren
de string ab: ab, ababab, maar niet abba, aabb, of
bb.
-
{a, b} : een a of een b.
-
? : een willekeurig symbool
-
?*: een willekeurige reeks symbolen
-
?- q : alle strings van 1 symbool behalve de q
-
a..z, 'A'..'Z', '0'..'9': de letter a of b of c ...of z, de letter A of
B of C.... of Z, het cijfer 0 of 1 of 2.... of 9.
-
a ^ : optioneel een a.
-
$ q : alle strings waarin ergens een q voorkomt (gelijk aan [? *,
q, ? *])
-
~ $ q : alle strings waarin de q niet voorkomt (gelijk aan (? -
q )* )
-
$ q & $ x : alle strings waarin zowel een q als een x (in willkeurige
volgorde) voorkomt.
3. Oefeningen
3.1. Eenvoudig
-
Geef een reguliere expressie voor `woorden', d.w.z. alle strings die slechts
bestaan uit letters
-
Geef een reguliere expressie voor `cijfer woorden', d.w.z. alle strings
die naast letters ook minstens een cijfer bevatten (Windows95,
dvi2ps, 2K, ...).
-
Geef een reguliere expressie voor `complexe woorden, d.w.z. alle strings
die naast letters ook minstens een ander teken (behalve de spatie) bevatten
(zwart-wit, windows3.1)
-
Geef een reguliere expressie die email adressen (gosse@let.rug.nl)
herkent: strings bestaande uit letters, de punt ('.'), en precies 1 apestaart.
N.b. Getallen en hoofdletters in reguliere expressies dienen tussen enkele quotes te staan:
'0', 'A'. In de string hoeft dit niet.
Tussen twee operatoren moet soms een spatie, met name tussen ~ en $.
3.2. Afkortingen
Het is soms ook belangrijk om in een tekst de gebruikte
afkortingen te kunnen herkennen. Een tekst naar spraak
systeem is een systeem dat in staat is geschreven teksten automatisch
uit te spreken. Hierbij is het herkennen van afkortingen cruciaal,
omdat die vaak heel anders moeten worden uitgesproken. Bijvoorbeeld,
indien in de tekst het woord EEG voorkomt, dan moet de
uitspraak luiden ee - ee - gee, en natuurlijk niet
eeg. Hetzelfde geldt voor een afkorting zoals
t.a.v. dat in zo'n systeem wellicht het liefst wordt
uitgesproken als ten aanzien van, en in ieder geval niet op
zo'n manier dat het rijmt op daf.
Reguliere expressies blijken ook hier cruciaal te zijn. Je kunt met
reguliere expressies immers precies definieren welke lettercombinaties
tot de afkortingen gerekend dienen te worden. In een eerste poging zou
je als volgt te werk kunnen gaan. Een afkorting is een woord dat
geheel uit hoofdletters bestaat:
A..Z+
of een punt bevat:
$ '.'
De twee mogelijkheden samen leveren dan:
{ A..Z+ , $ '.' }
Definieer een reguliere expressie om afkortingen te herkennen. Probeer
ervoor te zorgen dat voorbeelden zoals de volgende wel geaccepteerd
worden:
t.a.v. KPN
NAVO CIA
KGB mr.
jl. C.I.D.
o.a. PSP'er
NOSstudio NAVO-generaals
N.O.-I N.H.M.-tarieven
SALT-perscentrum oud-ASVA-voorzitter
N.S.B.ers S.S.'ers
Maar tegelijkertijd is het de bedoeling dat voorbeelden zoals deze
niet geaccepteerd worden:
Gertjan boterhammenzakje
15.30 4.49.6
... U
3.3 Lastig
Geef een reguliere expressie die alleen inputs herkent
bestaande uit de letters a en b, en waarvoor
bovendien geldt:
- dat het totaal aantal letters even zijn.
- dat het aantal a's even is.
- dat het aantal a's even is, en ook
het aantal b's even is.
- dat precies éénmaal drie a's achter elkaar
optreden.
- elke a wordt voorafgegaan door een b
- elke a wordt voorafgegaan door een a of een b
4. Macro's en auxiliary files
Voor de definitie van complexe reguliere expressies kun je gebruik maken
van macros. Deze definieer je in een apart (Prolog) bestand, bijvoorbeeld
mijn_macros.pl:
macro(klinker,{a,e,i,o,u,y}).
macro(medeklinker, {b,c,d,f,g,h,j,k,l,m,n,p,q,r,s,t,v,w,x,z}).
macro(lettergreep, [medeklinker *, klinker +, medeklinker *]).
Je kunt deze macro's laden door in het menu File te kiezen voor LoadAux
of Reconsult Aux en dan het betreffende bestand te selecteren.
Daarna kun je in de Regex regel bijvoorbeeld klinker gebruiken. Deze
expressie zal worden vertaald als bovenstaande reguliere expressie.
Macro's kunnen andere macro's aanroepen (zie lettergreep).