FLEX

Leksika ja süntaksianalüsaatorite genereerimiseks võib kasutada ka programme lex ja yacc (UNIX-süsteemi osad, PC-s - DOS-programmid, s.t. nende kasutamiseks peab käsuga cmd avama DOS-akna). Need programmid võib maha laadida aadressilt http://gnuwin32.sourceforge.net/packages/flex.htm (seal on viimane versioon, mis peaks töötama nii Windows XP ja vanemate Windows-ite all kui ka Linux-i all). Järgnevas on programmi flex (Fast LEX) veidi vanem, kuid juba TTÜ serveril asuva (aeglase võrguühenduse korral peaks saama kiiremini kätte) arj-pakitud osad koos manuaalidega (nii man kui ja html-failid); nende mahalaadimiseks SHIFT+klik (kasutage lehitseja "Save target" menüüd, muidu saadetakse failid tekstina ja neid ei saa avada):

yacc, lex arj-pakitud: ketas 1

ketas 2

ketas 3

ketas 4
.

Nende programmide installeerimiseks:

1. Salvesta kôik .arj-failid mingisse kataloogi (näiteks kataloogi c:\flex).

2. Paki .arj -failid lahti kas Winarj-iga või kui arvutis on installeeritud mingi arj- käskukeelt kasutav programm, siis käsuga

arj x -va -y asjad.arj
Programm arj.exe (selle saab maha laadida näiteks leheküljelt http://www.arjsoft.com/files.htm ) peab olema nähtav, näiteks samas kataloogis; kui arj.exe on näiteks kataloogis C:\ARJ ja see kataloog ei ole lisatud teele (PATH), tuleb ülaltoodud käsus arj asemel kasutada C:\ARJ\arj.exe; .arj-failide lahtipakkimisega tekib rida .zip-faile.

3. Paki lahti kôik .zip failid; Winzip kasutamisel tuleb lahti pakkida järhjest kõik zip-failid, näidates sihtkataloogina (kuhu lahti pakitakse) alati SAMA kataloogi, s.t. (näiteks C:\flex]; kui kasutatakse mingit käskulleöt (s.t. DOS-all töötvat lahtipakkimisprogrammi, programmi pkunzip saab näiteks leheküljelt http://nct.digitalriver.com/fulfill/0018.4), siis saab kõik teha ühe käsuga

for %%i in (*.zip) do pkunzip -d %%i

(kui kasutad NDos-i, siis %%i asemele tuleb %i).

4. Nüüd võid kustutada .a* (.arj) ja .zip failid.

5. Modifitseeri faili c:\autoexec.bat (Windows-is: "Start-Run-sysedit" või valides parempoolsega klikates "My Computer - Properties - Advanced - Environment Variables"): muutujale PATH tuleb lisada kataloog c:\lex\bin; uuemates Windows-ites (XP) Path puudub, sel juhul tuleb lisada rida

Path = C:\Flex;
Autoexec.bat-i tuleb ka lisada rida
set djgpp=c:\flex\djgpp.env

NB! Käsitsi editeerides tuleb Windows NT-s, Windows 2000-s, Windows XT-s tuleb autoexec.bat asemel muuta faili c:\windows\system32\autoexec.nt (kõik ülalkirjeldatud muudatused salvestatakse selles failis).
Et need muudatused hakkaks toimima, tuleb arvuti uuesti käivitada (teha restart).

Programm flex on DOS-aknas töötav programm, seega tuleb selle kasutamiseks enne käivitada MSDOS-aken ja teha oletuskataloogiks c:\lex\bin (järgnevas eeldatakse, et see kataloog on tehtud oletuskataloogiks ja kõik kasutatavad failid asuvad selles).

Programmi flex abil leksilise analüsaatori loomiseks tuleb:

1. luua tekstifail (näiteks number.lex), milles kirjeldatakse loodav leksiline analüsaator, järgides flex-i sisendfaili struktuurireegleid; see fail tuleb samuti paigutada kataloogi c:\lex\bin

2. käivitada flex käsuga

flex number.lex

(tekib c-programm lex.yy.c, mis on c-programm, milles on kirjeldatud loodava leksilise analüsaatori peaprotseduur yylex(); Flex-i vanema versiooni kasutamisel on faili nimi lexyy.c )

3. Kompileerida lex.yy.c GNU c-translaatori gcc-ga, näidates võtme -o järel väljundfaili (s.t. loodava leksilise analüsaatori faili; võtme ja failinime vahel ei tohi olla tühikut); kui väljundfailiks oleks näiteks numlex.exe, siis kompileerimine toimub käsuga

gcc lex.yy.c -onumlex

(võtme -o järel on loodava programmi nimi ilma laiendita .exe)

4. Saadud leksilise analüsaatori numlex.exe testimiseks loome sellele mingi sisendfaili, näiteks tekstifaili number.txt; selle analüüsimiseks loodud leksilise analüsaatoriga anname käsu

numlex.exe < number.txt

Selle käsu järel ilmub leksilise analüüsi tulemus ekraanile; kui seda soovitakse saada näiteks faili numout.txt, tuleb anda käsk

numlex.exe < number.txt > numout.txt

Kuna nii flex kui ka gcc kirjutavad töö tulemusena kettale uue faili, siis peab oletuskataloogiks olema tehtud kataloog, milles kasutajal on kirjutamisõigus, s.t. TTÜ arvutisaalis - kasutaja kodukataloog.
Ülalkirjeldatud muutuja Path modifikatsioon on selleks, et programmidele flex ja gcc viitamisel poleks tarvis kasutada nende täpset asukohta - pikki kataloogide nimesid (kus nad on salvestatud). TTÜ arvutisaalis AK-111 (109) on need juba lisatud - uuema versiooni jaoks. Kui arvutisaalis AK-111 (109) tahetakse kasutada Flex-i vanemat versiooni, peab DOS-sessiooni algul anda DOS aknas käsud, millega vanema flex-i ja gcc kataloogid lisatakse selle DOS-sessiooni ajal kasutatavasse PATH-i:

set path =%path%;c:\flex;
set set djgpp=c:\flex\djgpp.env;

Vanema versiooni kasutamisel tuleb arvestada, et Flex-i poolt loodud c-faili nimi on lexyy.c (mitte lex.yy.c)

Grammatika editor

Kasulik abivahend formaalsete grammatikate testimiseks ja silumiseks (genereerib grammatika abil saadavaid stringe ja koostab analüüsipuu) on grammatikaeditor, mille saab maha laadida aadressilt ozark.hendrix.edu/~burch/proj/grammar/download.html. Installeerida pole vaja, kuid arvutis peab olema installeeritud java runtime.

Kasutamisel peab jälgima järgmisi reegleid:
- mitteterminalid on suurtähed (esimese rea/produktsiooni vasakul pool olev mitteterminal on ka algussümbol), terminalid väiketähega algavad tähti ja numbreid sisaldavad stringid
- produktsioonimärk on ->
- kõigi sümbolite (terminalide ja mitteterminalide) vahel peab olema eraldajaks tühik.

Järgnevas on väike näide - 5-ndsüsteemis kirjutatud reaalarvu grammatika (s.t. kasutatakse ainult numbreid 0..4); kuna editor (praegu) ei võimalda kasutada muid märke, on reaalarvu eraldaks terminal punkt, arvu märk + on terminal pluss ja - terminal miinus järgumärk on e; mitteterminalide semantika: R - Reaalarv, A - algusosa (kuni punktini), L - Lõpposa, T - Täisarv, N - Number, M - märk; märgi produktsiooni viimane võimalus on tühi, s.t. märk võib ka puududa:

R -> A L
A -> M T punkt | M punkt
L -> T | T e T | T e M T
T -> N | N T
M -> pluss | miinus |
N -> 0 | 1 | 2 | 3 | 4

Küsimused, probleemid:
jaak@cc.ttu.ee

Tagasi loengute sisukorra juurde