Создание лексического анализатора с помощью команды lex

Команда lex помогает создать программу на языке C, которая может получать поток символов и преобразовывать его в действия программы.

Для использования команды lex необходим файл спецификаций, который содержит:

Расширенные регулярные выражения
Наборы символов, распознаваемые созданным лексическим анализатором.
Операторы действий
Компоненты программы на C, определяющие действия, которые выполняются для распознаваемых расширенных регулярных выражений.
Команда lex создает программу на языке C, которая может анализировать входной поток на основе информации, заданной в файле спецификаций. Команда lex создает программу в файле lex.yy.c. Если полученная программа применяется для распознавания простого ввода, в котором команде соответствует одно слово, вы можете скомпилировать файл lex.yy.c и получить исполняемую программу-лексический анализатор:

cc lex.yy.c -ll

Если программа должна распознавать более сложный синтаксис, потребуется разработать синтаксический анализатор который будет отвечать за обработку ввода совместно с лексическим анализатором.

Файл вывода lex.yy.c можно перенести в любую систему, в которой есть компилятор C, поддерживающий библиотечные функции lex.

Откомпилированный лексический анализатор выполняет следующие операции:
  • Считывает входной поток символов.
  • Копирует входной поток в выходной поток.
  • Разбивает входной поток на подстроки, соответствующие расширенным регулярным выражениям, описанным в файле спецификаций lex.
  • Выполняет действия, определенные для распознаваемых анализатором расширенных регулярных выражений. Эти действия определяются фрагментами программ на C, заданными в файле спецификаций lex. Такие фрагменты могут вызывать внешние по отношению к ним действия или функции.

Лексический анализатор, создаваемый командой lex, применяет метод анализа, называемый детерминированным конечным автоматом. Этот метод задает ограниченное число состояний лексического анализатора и определяет правила, согласно которым устанавливается состояние анализатора.

Автомат применяет опережающий просмотр более чем на один или два символа вперед. Предположим, например, что в файле спецификаций lex определено два правила: одно распознает строку ab, а другое - строку abcdefg. Если лексический анализатор получает на вход строку abcdefh, он считывает все символы до конца строки, а затем определяет, что строка не совпадает с abcdefg. После этого он возвращается к правилу, соответствующему строке ab, определяет, что оно соответствует части входной строки, обрабатывает его и начинает анализ оставшейся строки - cdefh.

Компиляция лексического анализатора

Для компиляции программы lex выполните следующие действия:
  1. С помощью программы lex преобразуйте файл спецификаций в программу на языке C. На выходе будет создан файл lex.yy.c.
  2. С помощью программы cc с флагом -ll откомпилируйте и скомпонуйте программу с библиотекой lex. На выходе будет создан исполняемый файл a.out.
Например, если файл спецификаций lex называется lextest, введите следующие команды:
lex lextest
cc lex.yy.c -ll