Lex
From Wikipedia, the free encyclopedia
Remove ads
У рачунарству, је рачунарски програм који генерише лексички анализатор. се обично користи са -ом. , који су написали Ерик Шмит (енгл. ) и Мајк Леск (енгл. ), постао је стандардни генератор за лексички анализатор на многим јуникс системима, а понашање -а одређено је правилима у стандарду.
чита улазни ток и враћа код који имплементира у програмском језику C.
Верзије -а базиране на АТ&Т коду су доступне као софтвер отвореног кода, као део -а и -а. Друга популарна верзија -а отвореног кода је , тј. брзи лексички анализатор (енгл. ).
Remove ads
Структура програма
Структура програма је намерно направљена да буде слична структури програма; програми су подељени на три дела, одвојена линијама које садрже само два процентна знака (%%), тј.:
Део за дефиниције %% Део за правила %% Део за C код
- Дефиницијски део је место где се дефинишу макрои и позива датотека написана на C-у. Овде је такође могуће написати било какав код који ће дословно бити копиран у генерисану изворну датотеку.
- Део за правила је најважнији део; он повезује обрасце са -овским исказима. Обрасци су регуларни изрази. Када види неки текст на улазу који одговара датом обрасцу, онда он извршава одговарајући део кода. Ово је основно у раду -а.
- Део за код садржи исказе и функције које се дословно копирају у генерисану изворну датотеку. Ови искази садрже позиве правила из дела за правила. У великим програмима много је лакше овај део кода записати у одвојеној датотеци и онда је повезати за време компајлирања.
Remove ads
Пример програма
Овај пример програма је за верзију -а. Препознаје ниске целих бројева са улаза и само их штампа на излаз:
/*** Део за дефиниције ***/ %{ /* C код ће да буде копиран дословно */ #include <stdio.h> %} /* Ово говори flex-у да чита само једау улазну датотеку */ %option noyywrap %% /*** Део за правила***/ /* [0-9]+ представља ниске које имају једну или више цифара */ [0-9]+ { /* yytext је ниска која садржи одговарајући препознати текст. */ printf("Primecen ceo broj: %s\n", yytext); } . { /* Игнориши све друге карактере. */ } %% /*** Део за С код***/ int main(void) { /* Позове lexer и онда прекине */ yylex(); return 0; }
Ако овај улаз дамо -у, он ће бити конвертован у програм, . Када се ово комајлира и покрене биће препознаване и исписиване ниске целих бројева. На пример, за дати улаз:
програм ће иштампати:
Primecen ceo broj: 123 Primecen ceo broj: 2 Primecen ceo broj: 6
Remove ads
Коришћење -а са -ом
и се обично користе заједно. користи формалну граматику да рашчлани улазни ток, а то не може да уради користећи само регуларне изразе. Са друге стране, не може да чита обични улазни ток, њему требају низови токена. се често користи да обезбеди са овим токенима.
Lex и make
може да се користи да одржава програме који користе . претпоставља да датотека са екстензијом .l
представља програм. зна како такву датотеку треба да обради да би се направила одговарајућа објектна датотека.
Претпоставимо да листа зависности у датотеци садржи име датотеке x.o
, а постоји датотека x.l
. Ако је x.l
модификован после датотеке x.o
(или ако x.o
не постоји), онда ће покренути x.l
, и онда ће објектни фајл x.o
бити креиран од lex.yy.c
.
Remove ads
Види још
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads