Оригинальный автор (ы) | Майк Леск, Эрик Шмидт |
---|---|
Первый выпуск | 1975 г.; 45 лет назад (1975) |
Репозиторий | |
Операционная система | Unix, Unix-подобный, Plan 9 |
Тип | Command |
Lex - это компьютерная программа, которая генерирует лексические анализаторы («сканеры» или «лексеры»).
Lex обычно используется с генератором парсера yacc . Lex, первоначально написанный Майком Леском и Эриком Шмидтом и описанный в 1975 году, является стандартным генератором лексического анализатора во многих Unix системах, и эквивалентный инструмент указан как часть стандарта POSIX.
Lex считывает входной поток, определяющий лексический анализатор, и выводит исходный код реализация лексера на языке программирования C. В дополнение к C, некоторые старые версии Lex могли также генерировать лексический анализатор в Ratfor.
Хотя изначально распространялось как проприетарное программное обеспечение, некоторые версии Lex теперь с открытым исходным кодом. Версии Lex с открытым исходным кодом, основанные на оригинальном проприетарном коде, теперь распространяются с операционными системами с открытым исходным кодом, такими как OpenSolaris и Plan 9 от Bell Labs. Одна популярная версия Lex с открытым исходным кодом, называемая flex, или «быстрый лексический анализатор», не является производным от проприетарного кодирования.
Структура файла Lex намеренно подобна структуре файла yacc; файлы разделены на три раздела, разделенных строками, содержащими только два знака процента, следующим образом:
Ниже приведен пример файла Lex для flex версия Lex. Он распознает строки чисел (положительные целые числа) во входных данных и просто распечатывает их.
/ *** Раздел определения *** /% {/ * Дословное копирование кода C * / #include%} / * Указывает flex читать только один входной файл * /% option noyywrap %% / *** Раздел правил *** / / * [0-9] + соответствует строке из одной или нескольких цифр * / [0-9] + {/ * yytext - это строка, содержащая совпадающий текст. * / printf ("Увидел целое число:% s \ n", yytext); }. | \ n {/ * Игнорировать все остальные символы. * /} %% / *** Раздел кода C *** / int main (void) {/ * Вызвать лексер, а затем выйти. * / yylex (); возврат 0; }
Если этот ввод передан в flex
, он будет преобразован в файл C, lex.yy.c
. Его можно скомпилировать в исполняемый файл, который сопоставляет и выводит строки целых чисел. Например, при вводе:
abc123z.! * 2gj6
программа напечатает:
Видела целое число: 123 Видела целое число: 2 Видела целое число: 6
Lex и генераторы парсеров, такие как Yacc или Bison, обычно используются вместе. Генераторы синтаксического анализатора используют формальную грамматику для синтаксического анализа входного потока, чего Lex не может сделать с помощью простых регулярных выражений (Lex ограничен простыми конечными автоматами ).
Это обычно предпочтительнее иметь (например, сгенерированный Yacc) синтаксический анализатор, подававший поток токенов в качестве входных данных, вместо того, чтобы потреблять входящий поток символов напрямую. Lex часто используется для создания такого потока токенов.
Без сканирования синтаксический анализ относится к синтаксическому анализу входного потока символов напрямую, без отдельного лексического анализатора.
make - это утилита, которая может использоваться для поддержки программ с участием Lex. Make предполагает что файл с расширением .l
является исходным файлом Lex. Внутренний макрос make LFLAGS
может использоваться для указания параметров Lex, которые будут автоматически вызываться программой make.
Викибу k Руководство по Unix содержит страницу по теме: Команды |
lex (1)
– Solaris 10 Справочник по командам пользователя Руководство lex (1)
– Plan 9 Руководство программиста, том 1