Lex (ինֆորմատիկա)
Lex, համակարգչային ծրագիր է, որն օգտագործվում է լեքսիկական անալիզատորների կառուցման համար։ Հիմնականում օգտագործվում է շարահյուսական անալիզատորներ գեներացնող Yacc ծրագրի հետ։ Lex[1]-ի առաջին տարբերակը ստեղծել են Մայք Լեսկը (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
Աղբյուր
[խմբագրել | խմբագրել կոդը]- ↑ Lesk, M.E.; Schmidt, E. «Lex – A Lexical Analyzer Generator». Արխիվացված է օրիգինալից 2020 թ․ դեկտեմբերի 18-ին. Վերցված է 2016 թ․ Նոյեմբերի 19-ին.