flex (Fast LEXical analyzer generator) — вільна альтернатива до . Часто використовується з вільним генератором синтаксичних аналізаторів Bison . На відміну від Bison, flex не є частиною GNU. Flex був написаний на C близько 1987.
Тип | генератор лексичних аналізаторів |
---|---|
Автор | d[1][2] |
Розробник | |
Стабільний випуск | 2.5.37 (3 серпня 2012 ) |
Операційна система | UNIX-подібна |
Мова програмування | C[3] |
Ліцензія | BSD license |
Репозиторій | github.com/westes/flex.git |
Вебсайт | flex.sourceforge.net |
Подібний лексичний сканер для — flex++, включений до пакету flex.
Використання
Lex (чи Flex) — інструмент для лексичного аналізу, що може використовуватись для виділення з сирцевого тексту певних рядків наперед заданим способом. Yacc (чи Bison) — інструмент для ; він читає текст і може використовуватись для конвертування послідовності слів у структурований формат для подальшої обробки.
На вході отримує текст у вільному форматі й правила виділення лексем. На виході дає код аналізатора, в вигляді функції на мові C.
Правила задаються в вигляді регулярних виразів ліворуч і, здебільшого, коду на мові C праворуч. Правила містять три секції, відокремлені рядком «%%»:
визначення
%%
правила
%%
код користувача
Визначення містять стартові значення й визначення, правила, безпосередньо самі вирази й дії, що відповідають їм, користувацький код просто включається в вивід flex. Деякі секції можуть бути відсутніми.
Функція аналізатора отримує текст на вході й виконує заданий код для кожної знайденої лексеми. Наприклад, даний код, для кожного входження username в тексті, виконає код («%s», getlogin()):
%% username printf( "%s", getlogin() );
Дана функція виведе в потік рядок, що повертається функцією getlogin(). Тобто, кожне входження username у вхідному потоці буде замінено значенням, поверненим getlogin(). Наприклад, іменем поточного користувача.
Правила, відповідно до яких підсумкова функція має друкувати на виході тип лексеми (if, змінна, число, унарна чи бінарна операція) та значення для деяких лексем:
%% ifprintf ("IF statement\n"); [a-z]+printf ("tag, value %s\n", yytext); {D}+printf ("decimal number %s\n", yytext); "++"printf ("unary op\n"); "+"printf ("binary op\n");
Приклад підрахунку кількості рядків і символів у тексті:
%{ int num_lines = 0, num_chars = 0; %} %% \n ++num_lines; ++num_chars; . ++num_chars; %% main() { yylex(); printf( "# of lines = %d, # of chars = %d\n", num_lines, num_chars ); }
Далі, функцію, створену генератором можливо використовувати з генераторами синтаксичних аналізаторів — зазвичай flex використовується разом з yacc чи bison. Синтаксичний аналізатор викликає функцію yylex(), створену генератором flex для пошуку наступної лексеми.
Приклад лексичного аналізатора
Одним із базових понять лексичного аналізу є логічний символ (токен). Логічний символ може складатися з одного чи кількох звичайних символів. Прикладом логічних символів, складених з кількох простих символів, можуть бути знаки операцій >=, <=, <>, ++ тощо. Ключові слова комп'ютерної мови також можуть розглядатись як різновид логічних символів. Тут і далі символами будуть називатись лише прості символи, щоб відрізнити їх від логічних символів.
Приклад сканера (написаного на C) для імперативної мови програмування .
Розпізнаються наступні логічні символи: '+
', '-
', '*
', '/'
, '=
', '(
', ')
', ',
', ';
', '.
', ':=
', '<
', '<=
', '<>
', '>
', '>=
'; числа: 0-9 {0-9}
; ідентифікатори: a-zA-Z {a-zA-Z0-9}
та ключові слова: begin
, call
, const
, do
, end
, if
, odd
, procedure
, then
, var
, while
.
Використовуються зовнішні змінні:
FILE *source /* Початковий файл */ int cur_line, cur_col, err_line, err_col /* Дані для інформації про помилку */ int num /* Останнє прочитане число, для синтаксичного аналізу */ char id[] /* Останній прочитаний ідентифікатор, для синтаксичного аналізу */ Hashtab *keywords /* Перелік ключових слів */
Зовнішні процедури:
error(const char msg[]) /* Повідомити про помилку */ Hashtab *create_htab(int estimate) /* Створити пошукову таблицю */ int enter_htab(Hashtab *ht, char name[], void *data) /* Додати елемент до пошукової таблиці */ Entry *find_htab(Hashtab *ht, char *s) /* Знайти елемент пошукової таблиці */ void *get_htab_data(Entry *entry) /* Повернути дані з пошукової таблиці */ FILE *fopen(char fn[], char mode[]) /* Відкрити файл для читання */ fgetc(FILE *stream) /* Прочитати наступний символ з потоку */ ungetc(int ch, FILE *stream) /* Повернути символ у потік */ isdigit(int ch), isalpha(int ch), isalnum(int ch) /* Класифікація символів */
Зовнішні типи:
Symbol /* Перелічуваний тип усіх логічних символів мови PL/0 */ Hashtab /* Пошукова таблиця */ Entry /* Елемент пошукової таблиці */
Сканування запускається викликом init_scan
, з передачею імені початкового файла. Якщо початковий файл успішно відкрито, синтаксичний аналізатор циклічно викликає getsym
, щоб повернути successive символи з вхідного файлу.
Основа сканера, getsym
, має бути зрозумілою. По-перше, пропускаються пробіли. Далі завантажений логічний символ класифікується. Якщо поточний простий символ входить до логічного символу з кількох простих символів, слід виконати додаткові дії. Числа перетворюються до внутрішнього формату, ідентифікатори перевіряються на наявність збігів з ключовими словами.
int read_ch(void) { int ch = fgetc(source); cur_col++; if (ch == '\n') { cur_line++; cur_col = 0; } return ch; } void put_back(int ch) { ungetc(ch, source); cur_col--; if (ch == '\n') cur_line--; } Symbol getsym(void) { int ch; while ((ch = read_ch()) != EOF && ch <= ' ') ; err_line = cur_line; err_col = cur_col; switch (ch) { case EOF: return eof; case '+': return plus; case '-': return minus; case '*': return times; case '/': return slash; case '=': return eql; case '(': return lparen; case ')': return rparen; case ',': return comma; case ';': return semicolon; case '.': return period; case ':': ch = read_ch(); return (ch == '=') ? becomes : nul; case '<': ch = read_ch(); if (ch == '>') return neq; if (ch == '=') return leq; put_back(ch); return lss; case '>': ch = read_ch(); if (ch == '=') return geq; put_back(ch); return gtr; default: if (isdigit(ch)) { num = 0; do { /* no checking for overflow! */ num = 10 * num + ch - '0'; ch = read_ch(); } while ( ch != EOF && isdigit(ch)); put_back(ch); return number; } if (isalpha(ch)) { Entry *entry; id_len = 0; do { if (id_len < MAX_ID) { id[id_len] = (char)ch; id_len++; } ch = read_ch(); } while ( ch != EOF && isalnum(ch)); id[id_len] = '\0'; put_back(ch); entry = find_htab(keywords, id); return entry ? (Symbol)get_htab_data(entry) : ident; } error("getsym: invalid character '%c'", ch); return nul; } } int init_scan(const char fn[]) { if ((source = fopen(fn, "r")) == NULL) return 0; cur_line = 1; cur_col = 0; keywords = create_htab(11); enter_htab(keywords, "begin", beginsym); enter_htab(keywords, "call", callsym); enter_htab(keywords, "const", constsym); enter_htab(keywords, "do", dosym); enter_htab(keywords, "end", endsym); enter_htab(keywords, "if", ifsym); enter_htab(keywords, "odd", oddsym); enter_htab(keywords, "procedure", procsym); enter_htab(keywords, "then", thensym); enter_htab(keywords, "var", varsym); enter_htab(keywords, "while", whilesym); return 1; }
Тепер порівняйте наведений вище код з кодом, щоб згенерувати сканер для тієї ж мови за допомогою flex:
%{ #include "y.tab.h" %} digit [0-9] letter [a-zA-Z] %% "+" { return PLUS; } "-" { return MINUS; } "*" { return TIMES; } "/" { return SLASH; } "(" { return LPAREN; } ")" { return RPAREN; } ";" { return SEMICOLON; } "," { return COMMA; } "." { return PERIOD; } ":=" { return BECOMES; } "=" { return EQL; } "<>" { return NEQ; } "<" { return LSS; } ">" { return GTR; } "<=" { return LEQ; } ">=" { return GEQ; } "begin" { return BEGINSYM; } "call" { return CALLSYM; } "const" { return CONSTSYM; } "do" { return DOSYM; } "end" { return ENDSYM; } "if" { return IFSYM; } "odd" { return ODDSYM; } "procedure" { return PROCSYM; } "then" { return THENSYM; } "var" { return VARSYM; } "while" { return WHILESYM; } {letter}({letter}|{digit})* { yylval.id = (char *)strdup(yytext); return IDENT; } {digit}+ { yylval.num = atoi(yytext); return NUMBER; } [ \t\n\r] /* skip whitespace */ . { printf("Unknown character [%c]\n",yytext[0]); return UNKNOWN; } %% int yywrap(void){return 1;}
Близько 50 рядків коду для flex проти близько 100 рядків отриманого коду.
Недоліки
Часова складність
Лексичний аналізатор Flex інколи має часову складність відносно розміру вхідних даних. Іншими словами, він виконує сталу кількість операцій для кожного вхідного логічного символу. Ця кількість достатньо низька: GCC генерує 12 інструкцій для циклу перевірки детермінованого автомату. Слід зазначити, що ця кількість не залежить від довжини токена, довжини регулярного виразу й розміру детермінованого автомату.
Однак, одна необов'язкова можливість Flex може змусити Flex генерувати сканер з нелінійною продуктивністю: використання макроса REJECT в сканері з можливістю позначати вкрай довгі токени. В цьому випадку, програміст безпосередньо вказав flex повернутись і спробувати ще раз після того, як він уже підібрав вхідні дані. В результаті, детермінований автомат буде змушений повернутись до пошуку інших прийнятних станів. Теоретично, часова складність становить , де — довжина найдовшого токена (це повертає до , якщо токени малі в порівнянні з розміром вхідних даних). Можливість REJECT за замовчуванням не дозволена, і вплив її на продуктивність детально задокументовано в інструкції користувача Flex.
Повторне використання
За замовчуванням синтаксичний аналізатор, згенерований за допомогою Flex, не розрахований на повторне використання. Це може викликати серйозні проблеми з програмами, що викликають згенерований сканер з різних тредів. Для обходу цієї проблеми існує додаткова опція, з якою Flex забезпечує можливість паралельного використання. Детальний опис цих опцій можна знайти в інструкції користувача Flex .
Flex++
Flex++ — інструмент для створення лексичних аналізаторів. Генератор синтаксичних аналізаторів створює програму синтаксичного аналізу мови. Це ж стосувалось програми flex.
Ці програми здійснюють синтаксичний аналіз і токенізацію шляхом використання машини визначеного кінцевого стану. Детермінований (чи недетермінований) автомат — теоретичний автомат, що приймає регулярні мови. Ці машини — підмножина колекції машин Тюрінга. Детерміновані автомати еквівалентні до (машин Тюрінга, де зі стрічки, що рухається вправо, можливе лише читання) чи недетермінованих автоматів. Синтаксис базується на використанні регулярних виразів.
Flex надає два способи генерування сканерів. Він початково генерує код мовою C код для компіляції на противагу бібліотекам і коду. Flex++, розширення flex, використовується для генерування C++ коду і класів. Класи й код Flex++ потребують компілятора C++ для створення програм лексичної перевірки та звіряння з шаблонами. Flex, альтернативний мовний синтаксичний аналізатор, за замовчуванням генерує a parsing scanner на мові C. Сканери на , згенеровані у Flex++, включають файл заголовку FlexLexer.h, який визначає інтерфейси двох згенерованих класів .
Розробники Flex
, з використанням багатьох ідей .
Див. також
- John Levine, Tony Mason, and Doug Brown, Lex & Yacc, O'Reilly and Associates (2nd edition).
- M. E. Lesk and E. Schmidt, LEX - Lexical Analyzer Generator
- Alfred Aho, Ravi Sethi and Jeffrey Ullman, Compilers: Principles, Techniques and Tools, Addison-Wesley (1986). Описує технології що використовуються в flex (детерміновані скінченні автомати)
- Генератор синтаксичних аналізаторів Bison
Посилання
- Flex Homepage
- ANSI-C Lex Specification [ 12 грудня 2010 у Wayback Machine.]
- JFlex: Fast Scanner Generator for Java [ 6 жовтня 2011 у Wayback Machine.]
- Brief description of Lex, Flex, YACC, and Bison [ 7 травня 2005 у Wayback Machine.]
- A Romanian rebuild version of this book in pdf format "fb2-press.pdf" or "fb2-printing.pdf" may be downloaded from or directly from or .
- Download Win32 binaries of Flex++ and Bison++ [ 14 квітня 2005 у Wayback Machine.]
Примітки
- Здебільшого — yylex().
Джерела
- https://cvsweb.openbsd.org/src/usr.bin/lex/README
- https://cvsweb.openbsd.org/src/usr.bin/lex/parse.y
- http://openbsd.su/src/usr.bin/lex/Makefile
- (August 2009). . O'Reilly Media. с. 304. ISBN . Архів оригіналу за 16 серпня 2011. Процитовано 15 листопада 2010.
- Is flex GNU or not? [ 3 березня 2016 у Wayback Machine.], flex FAQ
- Brown, Martin (31 травня 2006). (англ.). IBM. Архів оригіналу за 24 червня 2021. Процитовано 17 червня 2021.
- http://flex.sourceforge.net/manual/Performance.html [ 27 січня 2014 у Wayback Machine.] (last paragraph)
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
flex Fast LEXical analyzer generator vilna alternativa do Chasto vikoristovuyetsya z vilnim generatorom sintaksichnih analizatoriv Bison Na vidminu vid Bison flex ne ye chastinoyu GNU Flex buv napisanij na C blizko 1987 flexTipgenerator leksichnih analizatorivAvtord 1 2 RozrobnikStabilnij vipusk2 5 37 3 serpnya 2012 11 rokiv tomu 2012 08 03 Operacijna sistemaUNIX podibnaMova programuvannyaC 3 LicenziyaBSD licenseRepozitorijgithub com westes flex gitVebsajtflex sourceforge net Podibnij leksichnij skaner dlya C flex vklyuchenij do paketu flex VikoristannyaLex chi Flex instrument dlya leksichnogo analizu sho mozhe vikoristovuvatis dlya vidilennya z sircevogo tekstu pevnih ryadkiv napered zadanim sposobom Yacc chi Bison instrument dlya vin chitaye tekst i mozhe vikoristovuvatis dlya konvertuvannya poslidovnosti sliv u strukturovanij format dlya podalshoyi obrobki Na vhodi otrimuye tekst u vilnomu formati j pravila vidilennya leksem Na vihodi daye kod analizatora v viglyadi funkciyi na movi C Pravila zadayutsya v viglyadi regulyarnih viraziv livoruch i zdebilshogo kodu na movi C pravoruch Pravila mistyat tri sekciyi vidokremleni ryadkom viznachennya pravila kod koristuvacha Viznachennya mistyat startovi znachennya j viznachennya pravila bezposeredno sami virazi j diyi sho vidpovidayut yim koristuvackij kod prosto vklyuchayetsya v vivid flex Deyaki sekciyi mozhut buti vidsutnimi Funkciya analizatora otrimuye tekst na vhodi j vikonuye zadanij kod dlya kozhnoyi znajdenoyi leksemi Napriklad danij kod dlya kozhnogo vhodzhennya username v teksti vikonaye kod s getlogin username printf s getlogin Dana funkciya vivede v potik ryadok sho povertayetsya funkciyeyu getlogin Tobto kozhne vhodzhennya username u vhidnomu potoci bude zamineno znachennyam povernenim getlogin Napriklad imenem potochnogo koristuvacha Pravila vidpovidno do yakih pidsumkova funkciya maye drukuvati na vihodi tip leksemi if zminna chislo unarna chi binarna operaciya ta znachennya dlya deyakih leksem if printf IF statement n a z printf tag value s n yytext D printf decimal number s n yytext printf unary op n printf binary op n Priklad pidrahunku kilkosti ryadkiv i simvoliv u teksti int num lines 0 num chars 0 n num lines num chars num chars main yylex printf of lines d of chars d n num lines num chars Dali funkciyu stvorenu generatorom mozhlivo vikoristovuvati z generatorami sintaksichnih analizatoriv zazvichaj flex vikoristovuyetsya razom z yacc chi bison Sintaksichnij analizator viklikaye funkciyu yylex stvorenu generatorom flex dlya poshuku nastupnoyi leksemi Priklad leksichnogo analizatoraOdnim iz bazovih ponyat leksichnogo analizu ye logichnij simvol token Logichnij simvol mozhe skladatisya z odnogo chi kilkoh zvichajnih simvoliv Prikladom logichnih simvoliv skladenih z kilkoh prostih simvoliv mozhut buti znaki operacij gt lt lt gt tosho Klyuchovi slova komp yuternoyi movi takozh mozhut rozglyadatis yak riznovid logichnih simvoliv Tut i dali simvolami budut nazivatis lishe prosti simvoli shob vidrizniti yih vid logichnih simvoliv Priklad skanera napisanogo na C dlya imperativnoyi movi programuvannya Rozpiznayutsya nastupni logichni simvoli lt lt lt gt gt gt chisla 0 9 0 9 identifikatori a zA Z a zA Z0 9 ta klyuchovi slova begin call const do end if odd procedure then var while Vikoristovuyutsya zovnishni zminni FILE source Pochatkovij fajl int cur line cur col err line err col Dani dlya informaciyi pro pomilku int num Ostannye prochitane chislo dlya sintaksichnogo analizu char id Ostannij prochitanij identifikator dlya sintaksichnogo analizu Hashtab keywords Perelik klyuchovih sliv Zovnishni proceduri error const char msg Povidomiti pro pomilku Hashtab create htab int estimate Stvoriti poshukovu tablicyu int enter htab Hashtab ht char name void data Dodati element do poshukovoyi tablici Entry find htab Hashtab ht char s Znajti element poshukovoyi tablici void get htab data Entry entry Povernuti dani z poshukovoyi tablici FILE fopen char fn char mode Vidkriti fajl dlya chitannya fgetc FILE stream Prochitati nastupnij simvol z potoku ungetc int ch FILE stream Povernuti simvol u potik isdigit int ch isalpha int ch isalnum int ch Klasifikaciya simvoliv Zovnishni tipi Symbol Perelichuvanij tip usih logichnih simvoliv movi PL 0 Hashtab Poshukova tablicya Entry Element poshukovoyi tablici Skanuvannya zapuskayetsya viklikom init scan z peredacheyu imeni pochatkovogo fajla Yaksho pochatkovij fajl uspishno vidkrito sintaksichnij analizator ciklichno viklikaye getsym shob povernuti successive simvoli z vhidnogo fajlu Osnova skanera getsym maye buti zrozumiloyu Po pershe propuskayutsya probili Dali zavantazhenij logichnij simvol klasifikuyetsya Yaksho potochnij prostij simvol vhodit do logichnogo simvolu z kilkoh prostih simvoliv slid vikonati dodatkovi diyi Chisla peretvoryuyutsya do vnutrishnogo formatu identifikatori pereviryayutsya na nayavnist zbigiv z klyuchovimi slovami int read ch void int ch fgetc source cur col if ch n cur line cur col 0 return ch void put back int ch ungetc ch source cur col if ch n cur line Symbol getsym void int ch while ch read ch EOF amp amp ch lt err line cur line err col cur col switch ch case EOF return eof case return plus case return minus case return times case return slash case return eql case return lparen case return rparen case return comma case return semicolon case return period case ch read ch return ch becomes nul case lt ch read ch if ch gt return neq if ch return leq put back ch return lss case gt ch read ch if ch return geq put back ch return gtr default if isdigit ch num 0 do no checking for overflow num 10 num ch 0 ch read ch while ch EOF amp amp isdigit ch put back ch return number if isalpha ch Entry entry id len 0 do if id len lt MAX ID id id len char ch id len ch read ch while ch EOF amp amp isalnum ch id id len 0 put back ch entry find htab keywords id return entry Symbol get htab data entry ident error getsym invalid character c ch return nul int init scan const char fn if source fopen fn r NULL return 0 cur line 1 cur col 0 keywords create htab 11 enter htab keywords begin beginsym enter htab keywords call callsym enter htab keywords const constsym enter htab keywords do dosym enter htab keywords end endsym enter htab keywords if ifsym enter htab keywords odd oddsym enter htab keywords procedure procsym enter htab keywords then thensym enter htab keywords var varsym enter htab keywords while whilesym return 1 Teper porivnyajte navedenij vishe kod z kodom shob zgeneruvati skaner dlya tiyeyi zh movi za dopomogoyu flex include y tab h digit 0 9 letter a zA Z return PLUS return MINUS return TIMES return SLASH return LPAREN return RPAREN return SEMICOLON return COMMA return PERIOD return BECOMES return EQL lt gt return NEQ lt return LSS gt return GTR lt return LEQ gt return GEQ begin return BEGINSYM call return CALLSYM const return CONSTSYM do return DOSYM end return ENDSYM if return IFSYM odd return ODDSYM procedure return PROCSYM then return THENSYM var return VARSYM while return WHILESYM letter letter digit yylval id char strdup yytext return IDENT digit yylval num atoi yytext return NUMBER t n r skip whitespace printf Unknown character c n yytext 0 return UNKNOWN int yywrap void return 1 Blizko 50 ryadkiv kodu dlya flex proti blizko 100 ryadkiv otrimanogo kodu NedolikiChasova skladnist Leksichnij analizator Flex inkoli maye chasovu skladnist O n displaystyle O n vidnosno rozmiru vhidnih danih Inshimi slovami vin vikonuye stalu kilkist operacij dlya kozhnogo vhidnogo logichnogo simvolu Cya kilkist dostatno nizka GCC generuye 12 instrukcij dlya ciklu perevirki determinovanogo avtomatu Slid zaznachiti sho cya kilkist ne zalezhit vid dovzhini tokena dovzhini regulyarnogo virazu j rozmiru determinovanogo avtomatu Odnak odna neobov yazkova mozhlivist Flex mozhe zmusiti Flex generuvati skaner z nelinijnoyu produktivnistyu vikoristannya makrosa REJECT v skaneri z mozhlivistyu poznachati vkraj dovgi tokeni V comu vipadku programist bezposeredno vkazav flex povernutis i sprobuvati she raz pislya togo yak vin uzhe pidibrav vhidni dani V rezultati determinovanij avtomat bude zmushenij povernutis do poshuku inshih prijnyatnih staniv Teoretichno chasova skladnist stanovit O n m 2 O m 2 displaystyle O n m 2 geq O m 2 de m displaystyle m dovzhina najdovshogo tokena ce povertaye do O n displaystyle O n yaksho tokeni mali v porivnyanni z rozmirom vhidnih danih Mozhlivist REJECT za zamovchuvannyam ne dozvolena i vpliv yiyi na produktivnist detalno zadokumentovano v instrukciyi koristuvacha Flex Povtorne vikoristannya Za zamovchuvannyam sintaksichnij analizator zgenerovanij za dopomogoyu Flex ne rozrahovanij na povtorne vikoristannya Ce mozhe viklikati serjozni problemi z programami sho viklikayut zgenerovanij skaner z riznih trediv Dlya obhodu ciyeyi problemi isnuye dodatkova opciya z yakoyu Flex zabezpechuye mozhlivist paralelnogo vikoristannya Detalnij opis cih opcij mozhna znajti v instrukciyi koristuvacha Flex Flex Flex instrument dlya stvorennya leksichnih analizatoriv Generator sintaksichnih analizatoriv stvoryuye programu sintaksichnogo analizu movi Ce zh stosuvalos programi flex Ci programi zdijsnyuyut sintaksichnij analiz i tokenizaciyu shlyahom vikoristannya mashini viznachenogo kincevogo stanu Determinovanij chi nedeterminovanij avtomat teoretichnij avtomat sho prijmaye regulyarni movi Ci mashini pidmnozhina kolekciyi mashin Tyuringa Determinovani avtomati ekvivalentni do mashin Tyuringa de zi strichki sho ruhayetsya vpravo mozhlive lishe chitannya chi nedeterminovanih avtomativ Sintaksis bazuyetsya na vikoristanni regulyarnih viraziv Flex nadaye dva sposobi generuvannya skaneriv Vin pochatkovo generuye kod movoyu C kod dlya kompilyaciyi na protivagu C bibliotekam i kodu Flex rozshirennya flex vikoristovuyetsya dlya generuvannya C kodu i klasiv Klasi j kod Flex potrebuyut kompilyatora C dlya stvorennya program leksichnoyi perevirki ta zviryannya z shablonami Flex alternativnij movnij sintaksichnij analizator za zamovchuvannyam generuye a parsing scanner na movi C Skaneri na C zgenerovani u Flex vklyuchayut fajl zagolovku FlexLexer h yakij viznachaye interfejsi dvoh zgenerovanih klasiv C Rozrobniki Flex z vikoristannyam bagatoh idej Div takozhJohn Levine Tony Mason and Doug Brown Lex amp Yacc O Reilly and Associates 2nd edition M E Lesk and E Schmidt LEX Lexical Analyzer Generator Alfred Aho Ravi Sethi and Jeffrey Ullman Compilers Principles Techniques and Tools Addison Wesley 1986 Opisuye tehnologiyi sho vikoristovuyutsya v flex determinovani skinchenni avtomati Generator sintaksichnih analizatoriv BisonPosilannyaFlex Homepage ANSI C Lex Specification 12 grudnya 2010 u Wayback Machine JFlex Fast Scanner Generator for Java 6 zhovtnya 2011 u Wayback Machine Brief description of Lex Flex YACC and Bison 7 travnya 2005 u Wayback Machine A Romanian rebuild version of this book in pdf format fb2 press pdf or fb2 printing pdf may be downloaded from or directly from or Download Win32 binaries of Flex and Bison 14 kvitnya 2005 u Wayback Machine PrimitkiZdebilshogo yylex Dzherelahttps cvsweb openbsd org src usr bin lex README https cvsweb openbsd org src usr bin lex parse y http openbsd su src usr bin lex Makefile August 2009 O Reilly Media s 304 ISBN 978 0 596 15597 1 Arhiv originalu za 16 serpnya 2011 Procitovano 15 listopada 2010 Is flex GNU or not 3 bereznya 2016 u Wayback Machine flex FAQ Brown Martin 31 travnya 2006 angl IBM Arhiv originalu za 24 chervnya 2021 Procitovano 17 chervnya 2021 http flex sourceforge net manual Performance html 27 sichnya 2014 u Wayback Machine last paragraph