60 likes | 163 Views
LEX generátor lexikálnych analyzátorov. použitie: lex [ voľby ] subor.l voľby: -h výpis pomoci -oMENO.C meno výstupného súboru
E N D
LEXgenerátor lexikálnych analyzátorov • použitie:lex [voľby] subor.l • voľby: -h výpis pomoci -oMENO.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 výstup lexyy.exe • š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-z0-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 podmienka1 podmienka2 ... 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? nepovinné R R* 0,1,2,... opakovaní R R+ 1,2,3,... opakovaní R R|S R alebo S {M} substitúcia za M ^R R na začiatku riadku R$ R na konci riadku R/S R ak nasleduje S R{min,max} 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() /* … */ }