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