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