Создание лексического анализатора с помощью команды lex
Команда lex помогает создать программу на языке C, которая может получать поток символов и преобразовывать его в действия программы.
Для использования команды lex необходим файл спецификаций, который содержит:
- Расширенные регулярные выражения
- Наборы символов, распознаваемые созданным лексическим анализатором.
- Операторы действий
- Компоненты программы на C, определяющие действия, которые выполняются для распознаваемых расширенных регулярных выражений.
cc lex.yy.c -ll
Если программа должна распознавать более сложный синтаксис, потребуется разработать синтаксический анализатор который будет отвечать за обработку ввода совместно с лексическим анализатором.
Файл вывода lex.yy.c можно перенести в любую систему, в которой есть компилятор C, поддерживающий библиотечные функции lex.
- Считывает входной поток символов.
- Копирует входной поток в выходной поток.
- Разбивает входной поток на подстроки, соответствующие расширенным регулярным выражениям, описанным в файле спецификаций lex.
- Выполняет действия, определенные для распознаваемых анализатором расширенных регулярных выражений. Эти действия определяются фрагментами программ на C, заданными в файле спецификаций lex. Такие фрагменты могут вызывать внешние по отношению к ним действия или функции.
Лексический анализатор, создаваемый командой lex, применяет метод анализа, называемый детерминированным конечным автоматом. Этот метод задает ограниченное число состояний лексического анализатора и определяет правила, согласно которым устанавливается состояние анализатора.
Автомат применяет опережающий просмотр более чем на один или два символа вперед. Предположим, например, что в файле спецификаций lex определено два правила: одно распознает строку ab, а другое - строку abcdefg. Если лексический анализатор получает на вход строку abcdefh, он считывает все символы до конца строки, а затем определяет, что строка не совпадает с abcdefg. После этого он возвращается к правилу, соответствующему строке ab, определяет, что оно соответствует части входной строки, обрабатывает его и начинает анализ оставшейся строки - cdefh.
Компиляция лексического анализатора
- С помощью программы lex преобразуйте файл спецификаций в программу на языке C. На выходе будет создан файл lex.yy.c.
- С помощью программы cc с флагом -ll откомпилируйте и скомпонуйте программу с библиотекой lex. На выходе будет создан исполняемый файл a.out.
lex lextest
cc lex.yy.c -ll