FLEX-i programmi struktuur
Leksilise analüsaatori kirjeldus FLEX-i jaoks (FLEX-i sisendfail) koosneb kolmest osast:
definitsioonid
%%
reeglid
%%
kasutaja funktsioonid
Siin %% on faili struktuuri kuuluvad osade
eraldajad. Faili võib lisada c-kommentaarieraldajate /*
, */ vahel kommentaare ja selle esimeses osas võib defineerida c-kkeele
globaalmuutujaid (ja anda neile ka algväärtuse) täpselt samuti, kui seda tehakse
programmeerimiskeeles c C-definitsioonid tuleb võtta sulgude %{,
%} vahele. Kõik
read peavad algama rea esimesest positsioonist.
Programm kasutab globaalseid
muutujaid yytext (sellesse
kogutakse väljundtekst)
ja yyleng (stringi yytext pikkus)
FLEX-i abil kirjeldatud skanner on lihtsalt sisendteksti alamlõikude
teisendaja: definitsioonide osas definitsioonid
kirjeldatakse
regulaarsed avaldised, millele vastavad lõigud skanneri sisendtekstis tuleb
asendada vastavalt reeglid
-osas esitatud reeglitele; sisendi need
osad, mis ei vasta ühelegi kirjeldatud regulaarsele avaldisele, kopeeritakse
väljundisse muutumatult.
FLEX-i sisendfaili definitsioonid
-osas kirjeldatakse skaneerimisel kasutatavad mitteterminalid regulaarsete avaldiste abil, kasutades süntaksit
MITTETERMINAL REGULAARNE_AVALDIS
Siin REGULAARNE_AVALDIS kirjaviis erineb veidi üldkasutatavast:
kandilised sulud [ ] tähistavad nende vahel oleva avaldise poolt määratud tekstilõike;
valikuoperaatori | võib jätta kirjutamata, seega näiteks [abc] on kas a,
b või c (kuid selguse mõttes on see parem siiski kirjutada)
nn whitespace-märgid (TAB, reavahetus) tähistatakse nagu C-s: \t, \n
võib kasutada märkide vahemikke (ASCII-järjestus), näiteks a-z tähistab tähti
a,b,...,z (s.t. a-z on sama, kui tavalises regulaarsete avaldiste tähistusviisis a
| b | c | ... | z )
. tähistab ükskõik millist märki
(character), v.a. reavahetus (\n)
a* on sama, kui tavalises kirjaviisis (kas tühi või ükskõik kuimitu a-d)
a+ on sama, kui tavalises kirjaviisis (ükskõik kuimitu a-d, kuid vähemalt üks)
a? - tühi või üks a (s.t. [a] tavalises kirjaviisis)
a{3,5} - kolm, neli või viis a-d
a{2,} - kaks või rohkem a-d
a{3} - täpselt kolm a-d
Regulaarse avaldise A poolt kirjeldatud sisendteksti lõiku tähistatakse {A};
figuursulgude vahele tulevad võtta ka mitmerealised reeglite osad (s.t. see
on nagu C-programmilõik).
Märk ^ annab täiendi, näiteks [^A-Z] on ükskõik
milline märk,
v.a. suurtäht.
Lisaks eelpoolesitatule saab osutada sümboli esinemisele kas rea alguses või
lõpus jne; täpsemad reeglid on toodud flex-i juhendis
(see on üks flex-i lahtipakkimisel tekkivatest html-failidest kataloogis
./Gnudocs/Flex-2.5-4/Misc/Texinfo)
Küsimused, probleemid:
jaak@cc.ttu.ee
Tagasi loengute sisukorra juurde