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