LEX genertor lexiklnych analyztorov pouitie lex voby subor
LEX generátor lexikálnych analyzátorov • • • použitie: lex [voľby] subor. l voľby: -h výpis pomoci -o. MENO. C meno výstupného súboru výstup: zdrojový kód v jazyku C (lexyy. c alebo meno. c), kde funkcia int yylex() reprezentuje lexikálny analyzátor špecifikačný súbor subor. l LEX yylex ( ) lexyy. c prekladač C vstup lexyy. exe výstup • štruktúra špecifikačného súboru: deklarácie %% pravidlá %% funkcie
Špecifikačný súbor: Deklarácie Časť deklarácii môže obsahovať (môže byť aj prázdna): • špecifikácia substitučného reťazca (ako #define v C) - musí začínať na prvej pozícii v riadku: meno hodnota Pr. ID [a-z][a-z 0 -9]* • deklarácie v jazyku C - %{ a %} musia byť na prvej pozícii v riadku: %{ C kód /* direktívy preprocesora, deklarácie premenných a fukcií, …*/ %} Pr. %{ #include <string. h> int index; %} • špecifikácia počiatočných podmienok: %start podmienka 1 podmienka 2. . . Pr. %start vkomentari vretazci
Špecifikačný súbor: Pravidlá • • • Obsahuje postupnosť pravidiel, ktoré určujú aké vzorky sa majú vyhľadávať a čo sa má vykonať pri ich nájdení. Syntax pravidla: vzorka akcia (aktívne) <podmienky>vzorka akcia (podmienečne aktívne) Vzorka je špecifikovaná regulárnym výrazom, akcia príkazom v jazyku C (väčšinou zložený príkaz). Pravidlo musí začínať na prvej pozícii v riadku, medzerové znaky oddeľujú akciu od vzorky. Podmienečne aktívne pravidlá sa uplatňujú, iba ak je aktívna jedna z jeho podmienok. Podmienky sú tvorené zoznamom podmienok (definovaných v časti deklarácii) oddelených čiarkou(, ). Využitie pravidiel pri rozpoznávaní: • Uplatní sa to pravidlo, ktoré rozpoznáva najdlhšiu časť vstupného prúdu znakov. • Ak viacero pravidiel rozpoznáva túto časť, uplatní sa pravidlo skôr uvedené v špecifikačnom súbore. • Ak ani jedno pravidlo nerozpozná aktuálnu časť vstupu, použije sa implicitné pravidlo - kópia na výstup.
Pravidlá: regulárne výrazy · reg. výraz - postupnosť symbolov a operátorov: X znak X (nie operátor) "X" znak X X esc-znak X (n, t, . . . ) "XYZ" reťazec XYZ [XYZ] znak X alebo Y alebo Z [X-Z] znak X alebo Y alebo Z [^XYZ]ľubovoľný znak okrem X, Y, Z. ľubovolný znak okrem a (R) R? R* R+ R|S {M} R nepovinné R 0, 1, 2, . . . opakovaní R 1, 2, 3, . . . opakovaní R R alebo S substitúcia za M ^R R$ R/S R{min, max} R na začiatku riadku R na konci riadku R ak nasleduje S interval opakovania R
Pravidlá: akcie (činnosti) · akcia - príkaz alebo postupnosť príkazov v jazyku C v {} zátvorkách · využiteľné premenné LEXu: char yytex[]; rozpoznaný reťazec int yyleng; dĺžka rozpoznaného reťazca FILE *yyin; vstupný súbor (implicitne štandardný vstup) • využiteľné funkcie LEXu: ; prázdny príkaz(nič sa nevykoná) BEGIN podmienka; aktivácia pravidiel s danou podmienkou BEGIN 0; deaktivácia všetkých podmienených pravidiel ECHO; výpis obsahu yytext na výstup REJECT; vrátenie rozpoznaného reťazca späť na vstup int input(); zistenie nasledujúceho znaku zo vstupu void output(int c); vloženie znaku c na výstup void unput(); vrátenie znaku c na vstup
Špecifikačný súbor: Funkcie Obsahuje definície funkcií (je však nepovinná): • Používateľské funkcie - použité v akciách v časti pravidiel • Funkcia yywrap() - volaná pri zistení konca vstupu, pričom jej návratová hodnota určuje, či má analyzátor ukončiť svoju prácu (hodnota 1) alebo má pokračovať v analýze (hodnota 0), kedy je však nutné priradiť do premennej yyin nový zdroj vstupu. int yywrap(){return 1; } • int yywrap(){ if(pokracovat){ fclose(yyin); yyin=fopen(“novy. txt”, ”r”); return 0; } else return 1; } Funkcia main() - potrebná, ak chceme vytvoriť spustiteľnú verziu analyzátora. int main(int argc, char *argv[]){ /* … */ yylex() /* … */ }
- Slides: 6