Введение
Стандартная утилита UNIX
Lex — это компьютерная программа, генерирующая лексические анализаторы ("сканеры" или "лексеры"). Она широко используется совместно с генератором парсеров yacc и является стандартным генератором лексических анализаторов во многих Unix и Unix-подобных системах. Эквивалентный инструмент определён в стандарте POSIX. Lex считывает входной поток, описывающий лексический анализатор, и создаёт исходный код, реализующий этот анализатор на языке программирования C. Помимо C, некоторые старые версии Lex могли генерировать лексеры на Ratfor.
История
Лекс был первоначально написан Майком Леском и Эриком Шмидтом и описан в 1975 году. В последующие годы Lex стал стандартным генератором лексических анализаторов во многих Unix и Unix-подобных системах. В 1983 году Lex был одним из нескольких UNIX-инструментов, доступных для операционной системы UNOS компании Charles River Data Systems по лицензии Bell Laboratories. Хотя изначально распространялся как проприетарное программное обеспечение, некоторые версии Lex теперь имеют открытый исходный код. Версии Lex с открытым исходным кодом, основанные на оригинальном проприетарном коде, теперь распространяются вместе с операционными системами с открытым исходным кодом, такими как OpenSolaris и Plan 9 from Bell Labs. Одна из популярных версий Lex с открытым исходным кодом, называемая flex, или "быстрый лексический анализатор", не является производной от проприетарного кода.
Использование Lex с генераторами анализатора
Lex, как и другие лексические анализаторы, ограничивает правила теми, которые могут быть описаны регулярными выражениями. Благодаря этому, Lex может быть реализован конечным автоматом, что подтверждается иерархией языков Чомски. Для распознавания более сложных языков Lex часто используется совместно с генераторами парсеров, такими как Yacc или Bison. Генераторы парсеров используют формальную грамматику для разбора входного потока. Как правило, предпочтительнее, чтобы парсер, например, сгенерированный Yacc, принимал на вход поток токенов ("поток токенов"), а не обрабатывал поток символов ("поток символов") напрямую. Lex часто используется для создания такого потока токенов. Анализ без лексера (или сканерless-анализ) подразумевает непосредственный разбор входного потока символов, без использования отдельного лексического анализатора.
Лекс и МакКей
make — это утилита, которую можно использовать для сопровождения программ, использующих Lex. Make предполагает, что файл с расширением `.l` является исходным файлом Lex. Внутренняя макропеременная `LFLAGS` может использоваться для указания опций Lex, которые будут автоматически вызваны make.