Flex-programmi struktuur

Leksikaanalüsaatori kirjeldus FLEX-i jaoks (FLEX-i sisendfail) koosneb kolmest osast, mis on üksteisest sümbolitega %% eraldatud:

definitsioonid
%%
reeglid
%%
kasutaja funktsioonid

Siin esimeses osas  definitsioonid esitatakse mitteterminale kirjeldavad produktsioonid (noole asemel on tühik), teises osas reeglid kirjeldatakse regulaarsete avaldiste abil lekseemid (siin enam produktsioone pole).

Flex-programm genereerib sellest sisendfailist C-keelse programmi lex.yy.c (on loodud versioone ka teiste programmeerimiskeelte jaoks). Skanneri saamiseks tuleb Flex-i poolt loodud programm mingi C-keele translaatoriga transleerida täidetavaks .exe-failiks; selle peaprotseduur tuleb int yylex(void), s.t. loodud skanneri kasutamiseks tuleb käivitada protseduur yylex.

Flex-i sisendfaili koosneb Flex-i sisendkeeles kirjutatud osadest ja C-keeles kirjutatud osadest; sinna võib (näiteks) lisada C-kommentaarieraldajate /* ... */ vahel kommentaare ja selle esimeses osas võib defineerida C-keele globaalmuutujaid (ja anda neile ka algväärtuse) täpselt samuti, nagu seda tehakse programmeerimiskeeles C, kuid need definitsioonid tuleb võtta sulgude %{.. %} vahele.

Kõik Flex-i sisendkeele read peavad algama rea esimesest positsioonist (rea algul ei või olla tühikuid!). Kui rida ei alga esimesest positsioonist, loeb Flex rea C-keelseks ja kannab muutusteta väljundprogrammi lex.yy.c (ka C-keele kommentaarid ei tohi alata rea esimesest positsioonist). C-keelseteks loetakse ka kõik tekstilõigud märkide %{ %} vahel (mõlemad sulud peavad algama rea esimesest positsioonist), ka need kantakse muutusteta väljundisse.

Programm defineerib mitmeid globaalseid muutujaid; tähtsamad nendest on yytext (sellesse kogutakse loetud lekseemi tekst) ja yyleng (stringi yytext pikkus).

Märke

"  \  [  ]  ^  -  ?  .  *  +  |  (  )  $  /  {  }  %  <   >  

kasutatakse Flex-i sisendkeeles (s.t. Flex püüab neid interpreteerida), sellepärast peab need lekseemide kirjelduses andma kas apostroofide või jutumärkide vahel, näiteks nii: "\" või kirjutama nende ette nn escape-märgi \ (nagu C-s), s.t. esitama kujul \\.

Flex-i abil kirjeldatud skanner on tegelikult lihtsalt sisendteksti alamlõikude teisendaja (makro): ta asendab Flex-sisendi definitsioonide osas definitsioonid kirjeldatud regulaarsetele avaldistele vastavad lõigud skaneeritavas programmis (skanneri sisendis) vastavalt Flex-sisendi osas reeglid esitatud reeglitele; sisendi need osad, mis ei vasta ühelegi seal kirjeldatud regulaarsele avaldisele, kopeeritakse väljundisse muutumatult.

Flex-i sisendfaili definitsioonid-osas kirjeldatakse lekseemide kirjeldustes kasutatavad mitteterminalid produktsioonidega, mille parem pool on regulaarne avaldis; produktsioon MITTETERMINAL regulaarne_avaldis esitatakse kujul

MITTETERMINAL regulaarne_avaldis

s.t. produktsioonides kasutatava asemel on tühik.

Ka regulaarsete avaldiste kirjaviis erineb veidi üldkasutatavast:

- figuursulud { } tähistavad nende vahel oleva regulaarse avaldise poolt määratud tekstilõike, seega näit. reeglite osas varemdefineeritud mitteterminali kasutamisel reegli paremal pool peab see olema figuursulgude { } vahel;

- kandilised sulud [ ] tähistavad valikut, kusjuures valikuoperaatori | võib jätta kirjutamata, seega näiteks [abc] on kas a, b või c; selguse mõttes on parem siiski kirjutada | ;

- nn whitespace-märgid (TAB, reavahetus) tähistatakse nagu C-s: \t, \n;

- võib kasutada (ASCII-järjestusel põhinevaid) märkide vahemikke , näiteks a-z on sama, kui tavalises regulaarsete avaldiste tähistusviisis a | b | c | ... | z (eespool on kasutatud ka tähistust a..z );

- punkt . 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;

- märk ^ määrab täiendi, näiteks [^A-Z] on ükskõik milline märk, v.a. suurtäht; märk ^ avaldise ees tähistab selle avaldise poolt määratud tekstilõikku rea alguses, märk $ avalise järel märgib selle avaldise poolt määratud tekstilõikku rea lõpus.

Regulaarse avaldise A poolt kirjeldatud sisendteksti lõiku tähistab {A} (seega teises osas reeglid esinevad mitteterminalid peavad alati olema figuursulgude vahel, muidu loetakse need sisendteksti märkideks, s.t. terminalideks); figuursulgude vahele tulevad võtta ka mitmerealised reeglite osad (s.t. see on nagu C-programmilõik). Lisaks saab osutada ka 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 doc).



Küsimused, probleemid: ©2004-2013 Jaak Henno