Lex (ինֆորմատիկա)

Lex, համակարգչային ծրագիր է, որն օգտագործվում է լեքսիկական անալիզատորների կառուցման համար։ Հիմնականում օգտագործվում է շարահյուսական անալիզատորներ գեներացնող Yacc ծրագրի հետ։ Lex-ի առաջին տարբերակը ստեղծել են Մայք Լեսկը (Mike Lesk) և Էրիկ Շմիդտը (Eric Schmidt)։ Այն UNIX համակարգերում լեքսիկական անալիզատորներ գեներացնող ստանդարտ ծրագիր է, ինչպես նաև ավելացված է POSIX ստանդարտին։

Lex-ը կարդում է կառուցվելիք լեքսիկական անալիզատորը նկարագրող մուտքային հոսքը և գեներացնում է լեքսիկական անալիզատորի կոդը՝ գրված C լեզվով։

lex ֆայլի կառուցվածքը 
Լեքսիկական անալիզատորը նկարագրող ֆայլը, որ ծառայում է որպես Lex ծրագրի մուտքային հոսք, բաղկացած է երեք մասերից, որոնք իրարից անջատված են %% նշաններով։
 Սահմանումների բլոկ
 %%
 Կանոնների բլոկ
 %%
 C լեզվով գրված կոդի բլոկ

 Սահմանումների բլոկ-ը նախատեսված է մակրոսների սահմանման և C լեզվի վերնագրային (header) ֆայլերի կցման համար։ Այս բլոկում կարելի է գրել նաև C կոդի կտորներ, որոնք նույնությամբ կպատճենվեն ելքային ֆայլում։
 Կանոնների բլոկ-ը Lex-ծրագրի հիմնական և կարևոր մասն է, որը շաբլոններին համապատասխանեցնում է C լեզվով գրված հրամաններ (ծրագրերի կտորներ)։ Շաբլոններն իրենցից ներկայացնում են կանոնավոր արտահայտություններ։ Երբ լեքսիական անալիզատորը իր մուտքում տեսնում է շաբլոններից որևէ մեկին համապատասխանող տեքստ, այն գործարկում է տվյալ շաբլոնին համապատասխանեցրած C կոդը։ Սա Lex-ի աշխատանքի հիմնական սկզբունքն է։
 C լեզվով գրված կոդի բլոկ-ը պարունակում է C լեզվով գրված ծառայողական ֆունկցիաներ, որոնք նույնությամբ պատճենվում են ելքային ֆայլում։

lex ֆայլի օրինակ 

/*** Սահմանումներ ***/

%{
#include <stdio.h>
%}

%%
    /*** Կանոնների բլոկ ***/

    /* [0-9]+ արտահայտությունը ճանաչում է մեկից ավելի թվանշաններից կազմված տողերը */
[0-9]+  {
            /* yytext-ը ճանաչած տողը պարունակող փոփոխականն է */
            printf("Saw an integer: %s\n", yytext);
        }

.       {   /* Անտեսել բոլոր այլ սիմվոլները */   }

%%
/*** C կոդի բլոկ ***/

int main(void)
{
    /* Գործարկել լեքսիկական անալիզատորը, ապա՝ ավարտել։ */
    yylex();
    return 0;
}

Այս ֆայլը lex-ի կողմից թարգմանվելուց հետո կգեներացվի lex.yy.c աննունով C ֆայլ։ Այս ֆայլը կարելի է թարգմանել C կոմպիլյատորով և ստանալ մի կիրառություն, որը ճանաչում և արտածում է ամբողջ թվեր ներկայացնող տողերը։ Օրինակ, հետևյալ մուտքը ստանալիս.
 abc123z.!&*2ghj6

Ծրագիրը կարտածի.
 Saw an integer։ 123
 Saw an integer։ 2
 Saw an integer։ 6

Աղբյուր 

Ինֆորմատիկա
Ծրագրավորում