Кіріспе
Лексикалық талдауға арналған UNIX бағдарламасы. Flex (жылдам лексикалық талдау генераторы) – lex бағдарламасына еркін және ашық кодты балама. Бұл лексикалық талдаушыларды (немесе "сканерлер", немесе "лексерлер" деп те аталады) құратын компьютерлік бағдарлама. Ол жиі BSD-ден туындаған операциялық жүйелерде Berkeley Yacc парсер генераторымен бірге lex-тің іске асырылуы ретінде қолданылады (lex және yacc екеуі де POSIX стандартына кіреді), сондай-ақ *BSD порттарында және Linux дистрибутивтерінде GNU bison (yacc нұсқасы)мен бірге қолданылады. Bison-нан айырмашылығы, flex GNU жобасының бір бөлігі емес және GNU General Public License бойынша жарық көрмейді, алайда Flex-ке арналған нұсқаулық Free Software Foundation тарапынан жасалып, жарияланды.
Flex (fast lexical analyzer generator) is a free and open source software alternative to lex. It is a computer program that generates lexical analyzers (also known as "scanners" or "lexers"). It is frequently used as the lex implementation together with Berkeley Yacc parser generator on BSD derived operating systems (as both lex and yacc are part of POSIX), or together with GNU bison (a version of yacc) in *BSD ports and in Linux distributions. Unlike Bison, flex is not part of the GNU Project and is not released under the GNU General Public License, although a manual for Flex was produced and published by the Free Software Foundation.
Ішкі істер
Бұл бағдарламалар детерминистік шекті автоматты (DFA) қолдану арқылы символдарды талдау және токендеуді жүзеге асырады. DFA – тұрақты тілдерді қабылдайтын теориялық машина. Бұл машиналар Тьюринг машиналары жиынтығының ішкі жиыны болып табылады. DFA жазуға рұқсат етілмейтін, оңға қарай жылжылатын Тьюринг машиналарымен эквивалентті. Синтаксис тұрақты өрнектерді пайдалануға негізделген. Сондай-ақ, детерминистік емес шекті автоматты қараңыз.
Уақыт күрделілігі
Flex лексикалық анализаторы әдетте кіріс ұзындығына пропорционалды уақыт күрделілігіне ие. Яғни, ол әрбір кіріс символы үшін тұрақты санда операция жасайды. Бұл тұрақты сан өте төмен: GCC DFA сәйкестік циклы үшін 12 нұсқаулық жасайды. Токеннің ұзындығы, тұрақты өрнектің ұзындығы және DFA-ның көлемі тұрақты санға тәуелсіз екенін ескеріңіз. Дегенмен, өте ұзын токендерге сәйкес келу мүмкіндігі бар сканерде REJECT макросын пайдалану Flex-тің сызықтық емес өнімділігі бар сканерді жасауына себеп болуы мүмкін. Бұл мүмкіндік қосымша. Бұл жағдайда бағдарламашы Flex-ке, кірістің бір бөлігіне сәйкес келгеннен кейін "қайта оралып, қайтадан әрекет етуді" тікелей айтады. Бұл DFA-ны басқа қабылдау күйлерін табу үшін кері қадам жасауға мәжбүрлейді. REJECT мүмкіндігі әдепкі бойынша қосылмайды және оның өнімділігіне тигізетін әсеріне байланысты Flex нұсқаулығында оны пайдалану ұсынылмайды.
Қайта кірісу
Әдетте Flex құралымен жасалған сканер қайта кіретін болмайды. Бұл, бірнеше жіптен (thread) жасалған сканерді пайдаланатын бағдарламалар үшін қаулы проблемалар тудыруы мүмкін. Осы мәселені шешу үшін Flex қайта кіруді қамтамасыз етуге арналған опцияларды ұсынады. Осы опциялар туралы толық ақпарат Flex нұсқаулығында берілген.
Unix емес ортада пайдалану
Көбінесе жасалған сканерде Unix-ке тән unistd.h бас файлға сілтемелер болады. unistd.h файлын қамтитын кодты жасаудан аулақ болу үшін %option nounistd опциясын қолдану керек. Тағы бір мәселе – құрылған кодта кездесетін isatty (Unix кітапханасының функциясы) шақырылымы. %option never interactive опциясы flex-ті isatty қолданбайтын кодты жасауға мәжбүрлейді.
Басқа тілдерден алынған флексті қолдану
Flex тек C және C++ тілі үшін код жасай алады. Flex құралымен басқа тілдерде пайдалану үшін жасалған сканерлік кодты SWIG сияқты тіл байланыстыру құралын қолдануға болады.
Юникодты қолдау
Flex 1 байттық (8 биттік) екілік мәндермен ғана сәйкестік құра алады, сондықтан Unicode-ты қолдамайды. RE/flex және басқа баламалар Unicode сәйкестігін қолдайды.
Flex++
flex++ – бұл Flex жинағының бір бөлігі болып табылатын C++ үшін ұқсас лексикалық сканер. Шығарылған код, егер кіріс оған тәуелді болмаса, жадты бөлуге арналған құралдан (malloc немесе пайдаланушы ұсынған баламадан) басқа, ешқандай орындалу уақытына немесе сыртқы кітапханаға тәуелді емес. Бұл кіріктірілген және осыған ұқсас жағдайларда пайдалы болуы мүмкін, онда дәстүрлі операциялық жүйе немесе C орындалу уақытының мүмкіндіктері қолжетімді болмауы мүмкін. flex++ құрастырған C++ сканері FlexLexer.h атты бас файлды қамтиды, ол екі C++ класының интерфейстерін анықтайды.