Лексический анализ (Анализатор) в разработке компилятора с примером

Что такое лексический анализ?

Лексический анализ это самый первый этап разработки компилятора. Лексер принимает модифицированный исходный код, записанный в виде предложений. Другими словами, он помогает вам преобразовать последовательность символов в последовательность токенов. Лексический анализатор разбивает этот синтаксис на ряд токенов. Он удаляет все лишние пробелы или комментарии, написанные в исходном коде.

Программы, выполняющие лексический анализ при разработке компилятора, называются лексическими анализаторами или лексерами. Лексер содержит токенизатор или сканер. Если лексический анализатор обнаруживает, что токен недействителен, он генерирует ошибку. Роль лексического анализатора в разработке компилятора заключается в чтении потоков символов из исходного кода, проверке допустимых токенов и передаче данных синтаксическому анализатору, когда он этого требует.

Пример

How Pleasant Is The Weather?

См. этот пример лексического анализа; Здесь мы можем легко распознать пять слов «Как приятно», «Погода», «Какая погода». Для нас это очень естественно, поскольку мы можем распознавать разделители, пробелы и знаки препинания.

 HowPl easantIs Th ewe ather?

Теперь проверьте этот пример, мы также можем прочитать это. Однако это займет некоторое время, поскольку в нечетных местах расставлены разделители. Это не то, что приходит к вам немедленно.

Основные термины

Что такое лексема?

Лексема — это последовательность символов, включенная в исходную программу в соответствии с шаблоном соответствия токена. Это не что иное, как экземпляр токена.

Что такое токен?

Токены в конструкции компилятора представляют собой последовательность символов, которая представляет единицу информации в исходной программе.

Что такое шаблон?

Шаблон — это описание, которое используется токеном. В случае ключевого слова, которое используется в качестве токена, шаблон представляет собой последовательность символов.

Лексический анализатор Architecture: Как распознаются токены

Основная задача лексического анализа — считывание входных символов кода и создание токенов.

Лексический анализатор сканирует весь исходный код программы. Он идентифицирует каждый токен один за другим. Сканеры обычно реализуются для создания токенов только по запросу анализатора. Вот как работает распознавание токенов в дизайне компилятора:

Лексический анализатор Archiтекстура
Лексический анализатор Archiтекстура
  1. «Получить следующий токен» — это команда, которая отправляется от парсера к лексическому анализатору.
  2. Получив эту команду, лексический анализатор сканирует ввод, пока не найдет следующий токен.
  3. Он возвращает токен в Parser.

Лексический анализатор пропускает пробелы и комментарии при создании этих токенов. Если присутствует какая-либо ошибка, лексический анализатор сопоставит эту ошибку с исходным файлом и номером строки.

Роли лексического анализатора

Лексический анализатор выполняет следующие задачи:

  • Помогает идентифицировать токен в таблице символов.
  • Удаляет пробелы и комментарии из исходной программы.
  • Сопоставляет сообщения об ошибках с исходной программой.
  • Помогает вам расширить макросы, если они найдены в исходной программе.
  • Чтение входных символов из исходной программы

Пример лексического анализа, токенов и не-токенов

Рассмотрим следующееwing код, который передается в лексический анализатор

#include <stdio.h>
    int maximum(int x, int y) {
        // This will compare 2 numbers
        if (x > y)
            return x;
        else {
            return y;
        }
    }

Примеры созданных токенов

лексема Токены
Int Ключевое слово
максимальный идентификатор
( оператор
Int Ключевое слово
x идентификатор
, оператор
Int Ключевое слово
Y идентификатор
) оператор
{ оператор
If Ключевое слово

Примеры нетокенов

Тип Примеры
КОММЕНТАРИЙ // Это сравнит 2 числа
Директива препроцессора #включает в себя
Директива препроцессора #define NUMS 8,9
Макрос НУМС
Пробелы /н /б /т

Лексические ошибки

Последовательность символов, которую невозможно сканировать в какой-либо действительный токен, является лексической ошибкой. Важные факты о лексической ошибке:

  • Лексические ошибки встречаются не очень часто, но их следует устранять с помощью сканера.
  • Неправильное написание идентификаторов, операторов, ключевых слов рассматривается как лексическая ошибка.
  • Как правило, лексическая ошибка возникает из-за появления какого-либо недопустимого символа, чаще всего в начале токена.

Восстановление ошибок в лексическом анализаторе

Вот несколько наиболее распространенных методов восстановления ошибок:

  • Удаляет один символ из оставшегося ввода
  • В режиме паники последующие символы всегда игнорируются, пока мы не достигнем правильно сформированного токена.
  • Вставив недостающий символ в оставшийся ввод
  • Заменить символ другим персонажем
  • Транспонировать два серийных персонажа

Лексический анализатор против парсера

Лексический анализатор синтаксический анализатор
Программа сканирования ввода Выполнить синтаксический анализ
Определить токены Создайте абстрактное представление кода
Вставьте токены в таблицу символов Обновить записи таблицы символов
Это порождает лексические ошибки Он генерирует дерево разбора исходного кода.

Зачем разделять лексику и парсер?

  • Простота дизайна: упрощает процесс лексического и синтаксического анализа за счет исключения нежелательных токенов.
  • Для повышения эффективности компилятора: помогает повысить эффективность компилятора.
  • Специализация: можно применять специализированные методы для улучшения процесса лексического анализа.
  • Портативность: для связи с внешним миром требуется только сканер
  • Более высокая переносимость: особенности, специфичные для устройства ввода, ограничены лексером.

Преимущества лексического анализа

  • Метод лексического анализатора используется такими программами, как компиляторы, которые могут использовать проанализированные данные из кода программиста для создания скомпилированного двоичного исполняемого кода.
  • Он используется веб-браузерами для форматирования и отображения веб-страницы с помощью анализируемых данных из JavaScript, HTML, CSS
  • Отдельный лексический анализатор поможет вам построить специализированный и потенциально более эффективный процессор для решения этой задачи.

Недостаток лексического анализа

  • Вам придется потратить значительное время на чтение исходной программы и ее разбиение в виде токенов.
  • Некоторые регулярные выражения довольно сложны для понимания по сравнению с правилами PEG или EBNF.
  • Требуются дополнительные усилия для разработки и отладки лексера и описаний его токенов.
  • Для создания таблиц лексера и создания токенов требуются дополнительные накладные расходы во время выполнения.

Итоги

  • Лексический анализ — это самый первый этап разработки компилятора.
  • Лексемы и токены — это последовательности символов, включенные в исходную программу в соответствии с шаблоном соответствия токена.
  • Реализован лексический анализатор для сканирования всего исходного кода программы.
  • Лексический анализатор помогает идентифицировать токен в таблице символов
  • Последовательность символов, которую невозможно отсканировать до какого-либо допустимого токена, является лексической ошибкой.
  • Удаляет один символ из оставшегося ввода. Метод восстановления ошибок.
  • Лексический анализатор сканирует входную программу, в то время как синтаксический анализатор выполняет синтаксический анализ.
  • Это упрощает процесс лексического и синтаксического анализа за счет исключения нежелательных токенов.
  • Лексический анализатор используется веб-браузерами для форматирования и отображения веб-страницы с помощью анализируемых данных из JavsScript, HTML, CSS.
  • Самый большой недостаток использования лексического анализатора заключается в том, что для создания таблиц лексера и создания токенов требуются дополнительные накладные расходы во время выполнения.